Liste anlama özelliğine sahip bir sözlük oluşturma


1279

Python listesi anlama sözdizimini seviyorum.

Sözlük oluşturmak için de kullanılabilir mi? Örneğin, anahtar ve değer çiftlerini yineleyerek:

mydict = {(k,v) for (k,v) in blah blah blah}  # doesn't work

İlgili: collections.Counterbir şeyleri saymak için özel bir tür sözlüktür: Bir listedeki öğeleri saymak için bir sözlük kullanma
smci

Yanıtlar:


1898

Python 2.7 ve 3'ten itibaren, sadece diksiyon anlama sözdizimini kullanmalısınız :

{key: value for (key, value) in iterable}

Python 2.6 ve önceki sürümlerde, dictyerleşik bir anahtar / değer çifti yinelemesi alabilir, böylece bir liste kavrama veya jeneratör ifadesi iletebilirsiniz. Örneğin:

dict((key, func(key)) for key in keys)

Bununla birlikte, zaten yinelenebilir anahtar ve / veya val'larınız varsa, hiç bir anlama kullanmanıza gerek yoktur - en basit olanı dictyerleşik olanı doğrudan aramaktır :

# consumed from any iterable yielding pairs of keys/vals
dict(pairs)

# "zipped" from two separate iterables of keys/vals
dict(zip(list_of_keys, list_of_values))

1
['kedi', 'köpek', 'kedi' kelimelerinden oluşan bir durumum varsa ve anahtar olarak kelime ve değer olarak sayımla bir diksiyon yapmak istersem ne olur? Bunun için kısa ve etkili bir sözdizimi var mı?
cryanbhu

@cryanbhu, listedeki belirli bir öğenin tekrarlarını saymaksa
fortran

237

Python 3 ve Python 2.7+ sürümlerinde sözlük kavrayışı aşağıdaki gibidir:

d = {k:v for k, v in iterable}

Python 2.6 veya öncesi için fortran'ın cevabına bakınız .


57

Aslında, zaten bir tür haritalamayı anlıyorsa, söz konusu yapıcı sizin için nezaketle yapıyorsa, yinelenebilir üzerinde tekrarlamanıza bile gerek yoktur:

>>> ts = [(1, 2), (3, 4), (5, 6)]
>>> dict(ts)
{1: 2, 3: 4, 5: 6}
>>> gen = ((i, i+1) for i in range(1, 6, 2))
>>> gen
<generator object <genexpr> at 0xb7201c5c>
>>> dict(gen)
{1: 2, 3: 4, 5: 6}

40

Python 2.7'de şöyle gider:

>>> list1, list2 = ['a', 'b', 'c'], [1,2,3]
>>> dict( zip( list1, list2))
{'a': 1, 'c': 3, 'b': 2}

Sıkıştır onları !


11
Bu soruya hiç değinmiyor.
Jean-François Corbett

32

Python'da liste anlama özelliğine sahip bir sözlük oluşturma

Python listesi anlama sözdizimini seviyorum.

Sözlük oluşturmak için de kullanılabilir mi? Örneğin, anahtar ve değer çiftlerini yineleyerek:

mydict = {(k,v) for (k,v) in blah blah blah}

"Dict anlama" ifadesini arıyorsunuz - aslında:

mydict = {k: v for k, v in iterable}

Varsayım blah blah blahiki parçalı bir ittifaktır - çok yakınsınız. Bunun gibi bir "falan" yaratalım:

blahs = [('blah0', 'blah'), ('blah1', 'blah'), ('blah2', 'blah'), ('blah3', 'blah')]

Diksiyon anlama sözdizimi:

Şimdi buradaki sözdizimi eşleme kısmıdır. Bunu bir dictanlama yerine bir setkavrayış yapan şey (sahte kodunuzun yaklaştığı şey) :aşağıdaki gibi iki nokta üst üste işaretidir :

mydict = {k: v for k, v in blahs}

Ve işe yaradığını ve ekleme talimatını Python 3.7'den itibaren tutması gerektiğini görüyoruz:

>>> mydict
{'blah0': 'blah', 'blah1': 'blah', 'blah2': 'blah', 'blah3': 'blah'}

Python 2 ve 3.6'ya kadar sipariş garanti edilmedi:

>>> mydict
{'blah0': 'blah', 'blah1': 'blah', 'blah3': 'blah', 'blah2': 'blah'}

Filtre Ekleme:

Tüm kavrayışlar, bir eşleme bileşeni ve rasgele ifadeler sağlayabileceğiniz bir filtreleme bileşeni içerir.

Böylece sonuna bir filtre parçası ekleyebilirsiniz:

>>> mydict = {k: v for k, v in blahs if not int(k[-1]) % 2}
>>> mydict
{'blah0': 'blah', 'blah2': 'blah'}

Burada sadece anahtarları ve değerleri eşlemeden önce verileri filtrelemek için son karakterin 2'ye bölünebilir olup olmadığını test ediyoruz.


23

Python sürüm <2.7 (RIP, 3 Temmuz 2010 - 31 Aralık 2019) , aşağıdakileri yapın:

d = dict((i,True) for i in [1,2,3])

Python sürümü> = 2.7, aşağıdakileri yapın:

d = {i: True for i in [1,2,3]}

22

@ Fortran'ın cevabına eklemek için, bir anahtar listesinin key_listyanı sıra bir değerler listesi üzerinde yineleme yapmak istiyorsanız value_list:

d = dict((key, value) for (key, value) in zip(key_list, value_list))

veya

d = {(key, value) for (key, value) in zip(key_list, value_list)}

6

Dict anlama kullanarak sözlük oluşturmanın başka bir örneği:

Burada ne i tring am burada her çifti bir alfabe sözlüğü oluşturmaktır; ingilizce mektup ve ingilizce alfabe karşılık gelen konumu

>>> import string
>>> dict1 = {value: (int(key) + 1) for key, value in 
enumerate(list(string.ascii_lowercase))}
>>> dict1
{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4, 'g': 7, 'f': 6, 'i': 9, 'h': 8, 
'k': 11, 'j': 10, 'm': 13, 'l': 12, 'o': 15, 'n': 14, 'q': 17, 'p': 16, 's': 
19, 'r': 18, 'u': 21, 't': 20, 'w': 23, 'v': 22, 'y': 25, 'x': 24, 'z': 26}
>>> 

Listedeki alfabe ve dizinlerinin listesini almak ve sözlük için anahtar değer çiftini oluşturmak üzere alfabe ve dizinleri değiştirmek için burada numaralandırmanın kullanıldığına dikkat edin

Umarım bu size sözlük comp iyi bir fikir verir ve kodunuzu kompakt hale getirmek için daha sık kullanmanızı teşvik eder


1
Güzel cevap - basitleştirilmiş:d = {k: v+1 for v, k in enumerate(string.ascii_lowercase)}
johnnydrama

4

Bunu dene,

def get_dic_from_two_lists(keys, values):
    return { keys[i] : values[i] for i in range(len(keys)) }

Ülke ve başkentte iki listemiz olduğunu varsayın

country = ['India', 'Pakistan', 'China']
capital = ['New Delhi', 'Islamabad', 'Beijing']

Ardından iki listeden sözlük oluşturun:

print get_dic_from_two_lists(country, capital)

Çıktı böyle,

{'Pakistan': 'Islamabad', 'China': 'Beijing', 'India': 'New Delhi'}

9
zip kullanabilirsiniz
Andre Simon

2
>>> {k: v**3 for (k, v) in zip(string.ascii_lowercase, range(26))}

Python, benzer şekilde özlü bir sözdizimi kullanarak çalışma zamanında sözlük oluşturmayı ifade etmenizi sağlayan diksiyon anlamalarını destekler.

Bir sözlük kavrama, {anahtar: değer için (anahtar, değer) yinelenebilir} biçimini alır. Bu sözdizimi Python 3'te tanıtıldı ve Python 2.7'ye kadar desteklendi, bu nedenle hangi Python sürümünü kurduğunuzdan bağımsız olarak kullanabilmeniz gerekir.

Standart bir örnek, iki liste almak ve ilk listedeki her bir konumdaki öğenin bir anahtar ve ikinci listedeki ilgili konumdaki öğenin değer haline geldiği bir sözlük oluşturmaktır.

Bu kavramada kullanılan zip işlevi, bir grup yinelemesini döndürür; burada gruptaki her eleman, her bir giriş yinelemesinde aynı konumdan alınır. Yukarıdaki örnekte, döndürülen yineleyici tuples (“a”, 1), (“b”, 2) vb. İçerir.

Çıktı:

{'i': 512, 'e': 64, 'o': 2744, 'h': 343, 'l': 1331, 's': 5832, 'b': 1, 'w': 10648, ' c ': 8,' x ': 12167,' y ': 13824,' t ': 6859,' p ': 3375,' d ': 27,' j ': 729,' a ': 0,' z ' : 15625, 'f': 125, 'q': 4096, 'u': 8000, 'n': 2197, 'm': 1728, 'r': 4913, 'k': 1000, 'g': 216 , 'v': 9261}


2

Bu kod, kullanılabilecek farklı değerlere sahip birden çok liste için liste kavrama özelliğini kullanarak sözlük oluşturur pd.DataFrame()

#Multiple lists 
model=['A', 'B', 'C', 'D']
launched=[1983,1984,1984,1984]
discontinued=[1986, 1985, 1984, 1986]

#Dictionary with list comprehension
keys=['model','launched','discontinued']
vals=[model, launched,discontinued]
data = {key:vals[n] for n, key in enumerate(keys)}

enumerategeçecek niçin valsher maç için keyonun listesiyle


1

Başka bir örnek vermek gerekirse. Aşağıdaki listeye sahip olduğunuzu düşünün:

nums = [4,2,2,1,3]

ve anahtarın dizin ve değerin listedeki öğe olduğu bir dikteye dönüştürmek istersiniz. Bunu aşağıdaki kod satırıyla yapabilirsiniz:

{index:nums[index] for index in range(0,len(nums))}

0

Her çift için yeni bir diksiyon oluşturabilir ve bir önceki diksiyonla birleştirebilirsiniz:

reduce(lambda p, q: {**p, **{q[0]: q[1]}}, bla bla bla, {})

Açıkçası bunu gerektirir yaklaşımlar reducedan functools.


aynı fikir: azaltmak (lambda p, q: {** p, ** dict ([q])}, bla bla bla, {})
Mahmoud Khaled
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.