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
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
Yanıtlar:
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, dict
yerleş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ı dict
yerleş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))
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 .
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}
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ı !
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 blah
iki 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')]
Şimdi buradaki sözdizimi eşleme kısmıdır. Bunu bir dict
anlama yerine bir set
kavrayış 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'}
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.
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]}
@ Fortran'ın cevabına eklemek için, bir anahtar listesinin key_list
yanı 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)}
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
d = {k: v+1 for v, k in enumerate(string.ascii_lowercase)}
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'}
>>> {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}
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)}
enumerate
geçecek n
için vals
her maç için key
onun listesiyle
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 reduce
dan functools
.
collections.Counter
bir şeyleri saymak için özel bir tür sözlüktür: Bir listedeki öğeleri saymak için bir sözlük kullanma