Anahtar-değer demetlerinin listesini sözlüğe nasıl dönüştürebilirim?


125

Şöyle görünen bir listem var:

[('A', 1), ('B', 2), ('C', 3)]

Bunu şuna benzeyen bir sözlüğe dönüştürmek istiyorum:

{'A': 1, 'B': 2, 'C': 3}

Bunu yapmanın en iyi yolu nedir?

DÜZENLEME: Tuples listem aslında daha çok şöyle:

[(A, 12937012397), (BERA, 2034927830), (CE, 2349057340)]

1
Bu kişiler ne tür A, B(ya da BERA) ve C(veya CE) gerçekten? Teşekkürler
yiyin

Aşağıdaki çalışma örnekleriyle üretilen hataların, onun bir tuple listesi olmaması, ancak 2-tuples'e ayrılmasını istediği son derece uzun bir listeyle ilgili olduğuna bahse girerim.
gddc

Yanıtlar:


90

Bu bana listeyi bölmeye ve sıkıştırmaya çalışırken aynı hatayı veriyor. ValueError: sözlük güncelleme sıra öğesi # 0'ın uzunluğu 1916'dır; 2 gereklidir

BU sizin asıl sorunuz.

Cevap, listenizdeki unsurların sandığınız gibi olmamasıdır. Eğer yazarsanız myList[0], listenizin ilk elemanının iki tuple olmadığını ('A', 1), bunun yerine 1916 uzunluklu bir yinelenebilir olduğunu göreceksiniz.

Eğer bir kez aslında orijinal soruya belirtildiği formda bir listesi var ( myList = [('A',1),('B',2),...]), yapmanız gereken tek şey dict(myList).


Teşekkürler, liste nasıl bu hale geldi bilmiyorum ama sıfırdan yeniden çalıştıktan sonra düzeltmeyi başardım.
Fred Wilson

1
@DJ_Stuffy_K: (bağlamın bu soruyla ilgisi olmadığını varsayarsak) Genel olarak, gereksiz olmadığı veya programınızı yavaşlatmadığı sürece, örtük olarak oluşturduğunuz soyut veri yapısına yardımcı indeksler olarak diktler oluşturmak son derece iyidir. "İyi uygulama" kavramı tamamen içeriğe bağlıdır; anahtarlar için O (1) arama süresine ihtiyacınız var mı? Ayrıca keyfi olarak "listeleri sözlüğe dönüştüremezsiniz"; tamamen anlambilime bağlıdır. örneğin [(1,2), (1,3)]-> {1:3}anahtarlarınızı bozabilir ve bilgilerinizi kaybedebilir! Bir dikte, O (1) ekleme / silme süresi ile bire * ilişkisidir. Liste bir listedir.
ninjagecko

163
>>> dict([('A', 1), ('B', 2), ('C', 3)])
{'A': 1, 'C': 3, 'B': 2}

5
Ayrıca aynı anlaşılacağı başka bir yanıt yorumladı: Bu yinelenen tanımlama grubu 'tuşları' mesela sahip kapsamaz l=[('A',1), ('B',2), ('C',3), ('A', 2)]sahip sonuçlanacaktır 'A': 1istenen sonucu vermeyebilir hangi.
2016

32

Bunu denedin mi

>>> l=[('A',1), ('B',2), ('C',3)]
>>> d=dict(l)
>>> d
{'A': 1, 'C': 3, 'B': 2}

ValueError: sözlük güncelleme sıra öğesi # 0'ın uzunluğu 1916'dır; 2 gereklidir
Fred Wilson

Bu benim terminalimden düz bir kesip yapıştırdı, bu yüzden işe yaramalı. Bu hatayı almak için ne yaptığınızı tam olarak gösterebilir misiniz?
Yararsız

@Fred, bir şeyi yanlış yazmış olmalısın, bu cevap iyi.
martineau

@FredWilson, böyle bir şey denediğinizde genellikle aldığınız hatadict([string1, string2, string3, string4])
chacham15

2
Bu, yinelenen tuple 'anahtarlarına' sahip olmayı kapsamaz, örneğin: l=[('A',1), ('B',2), ('C',3), ('A', 2)]hangisinin 'A': 1istenen sonuç olmayabilir.
2016

10

Yinelenen tuple "anahtarlarını" işlemenin bir yolu:

# An example
l = [('A', 1), ('B', 2), ('C', 3), ('A', 5), ('D', 0), ('D', 9)]

# A solution
d = dict()
[d [t [0]].append(t [1]) if t [0] in list(d.keys()) 
 else d.update({t [0]: [t [1]]}) for t in l]
d

OUTPUT: {'A': [1, 5], 'B': [2], 'C': [3], 'D': [0, 9]}

Müthiş! Bana yardım etti.
Unairestgood

harika !, çok yardım etti
Athar

2

Sözlük anlamalarını kullanmanın başka bir yolu,

>>> t = [('A', 1), ('B', 2), ('C', 3)]
>>> d = { i:j for i,j in t }
>>> d
{'A': 1, 'B': 2, 'C': 3}

2

Tuple'ın anahtar tekrarı yoksa, basittir.

tup = [("A",0),("B",3),("C",5)]
dic = dict(tup)
print(dic)

Demet anahtar tekrarlarına sahipse.

tup = [("A",0),("B",3),("C",5),("A",9),("B",4)]
dic = {}
for i, j in tup:
    dic.setdefault(i,[]).append(j)
print(dic)

1
l=[['A', 1], ['B', 2], ['C', 3]]
d={}
for i,j in l:
d.setdefault(i,j)
print(d)
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.