Bagaimana cara mengubah daftar tuple nilai kunci ke dalam kamus?

125

Saya memiliki daftar yang terlihat seperti:

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

Saya ingin mengubahnya menjadi kamus yang terlihat seperti:

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

Apa cara terbaik untuk melakukannya?

EDIT: Daftar tupel saya sebenarnya lebih seperti:

[(A, 12937012397), (BERA, 2034927830), (CE, 2349057340)]
Fred Wilson
sumber
1
Entitas apa itu A, B(atau BERA) dan C(atau CE) sebenarnya? Terima kasih
makan
Saya berani bertaruh bahwa kesalahan yang dihasilkan dengan contoh-contoh kerja di bawah ini terkait dengan dia tidak memiliki daftar tupel, tetapi daftar yang sangat panjang yang ingin dipisahkan menjadi 2-tupel.
gddc

Jawaban:

90

Ini memberi saya kesalahan yang sama ketika mencoba untuk membagi daftar dan zip itu. ValueError: elemen urutan pembaruan kamus # 0 memiliki panjang 1916; 2 diperlukan

ITULAH pertanyaan Anda yang sebenarnya .

Jawabannya adalah bahwa elemen-elemen dalam daftar Anda bukan seperti yang Anda pikirkan. Jika Anda mengetik, myList[0]Anda akan menemukan bahwa elemen pertama dari daftar Anda bukan dua-tupel, misalnya ('A', 1), tetapi lebih panjang 1916 iterable.

Setelah Anda benar - benar memiliki daftar dalam formulir yang Anda sebutkan dalam pertanyaan awal Anda ( myList = [('A',1),('B',2),...]), yang perlu Anda lakukan adalah dict(myList).

ninjagecko
sumber
Terima kasih, saya tidak tahu bagaimana daftar bisa seperti itu, tetapi setelah mengolahnya kembali dari awal, saya bisa memperbaikinya.
Fred Wilson
1
@DJ_Stuffy_K: (dengan asumsi konteks tidak terkait dengan pertanyaan ini) Secara umum, kecuali jika itu berlebihan atau memperlambat program Anda, baik-baik saja untuk membuat dicts sebagai indeks bermanfaat ke dalam struktur data abstrak apa pun yang Anda bangun secara implisit. Gagasan "praktik yang baik" sepenuhnya tergantung pada konteks; apakah Anda memerlukan O (1) waktu pencarian untuk kunci? Anda juga tidak dapat "mengonversi daftar menjadi kamus" secara sewenang-wenang; sepenuhnya tergantung pada semantik. misalnya [(1,2), (1,3)]-> {1:3}akan merusak kunci Anda dan kehilangan info! Dict adalah hubungan satu-ke-* dengan O (1) waktu insert / delete. Daftar adalah daftar.
ninjagecko
162
>>> dict([('A', 1), ('B', 2), ('C', 3)])
{'A': 1, 'C': 3, 'B': 2}
Andreas Jung
sumber
5
Juga mengomentari jawaban lain yang menunjukkan hal yang sama: Ini tidak mencakup duplikat 'kunci' misalnya: l=[('A',1), ('B',2), ('C',3), ('A', 2)]akan menghasilkan memiliki 'A': 1yang mungkin bukan hasil yang diinginkan.
Persaingan
32

Sudahkah Anda mencoba ini?

>>> l=[('A',1), ('B',2), ('C',3)]
>>> d=dict(l)
>>> d
{'A': 1, 'C': 3, 'B': 2}
Tak berguna
sumber
ValueError: elemen urutan pembaruan kamus # 0 memiliki panjang 1916; 2 diperlukan
Fred Wilson
Itu adalah sayatan langsung dari terminal saya, jadi itu harus bekerja. Bisakah Anda menunjukkan dengan tepat apa yang Anda lakukan untuk mendapatkan kesalahan itu?
berguna
@ Fred, Anda pasti salah ketik sesuatu, jawaban ini baik-baik saja.
martineau
@FredWilson itu adalah kesalahan yang biasanya Anda dapatkan ketika Anda mencoba sesuatu sepertidict([string1, string2, string3, string4])
chacham15
2
Ini tidak mencakup memiliki duplikat 'kunci' tupel misalnya: l=[('A',1), ('B',2), ('C',3), ('A', 2)]akan menghasilkan 'A': 1yang mungkin bukan hasil yang diinginkan.
Persaingan
10

Berikut adalah cara untuk menangani duplikat "kunci" tuple:

# 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]}
Tam Le
sumber
Luar biasa! Bantu aku keluar.
unpairestgood
Hebat !, membantu banyak
Athar
2

Cara lain menggunakan pemahaman kamus,

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

Jika Tuple tidak memiliki pengulangan kunci, itu Sederhana.

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

Jika tuple memiliki pengulangan kunci.

tup = [("A",0),("B",3),("C",5),("A",9),("B",4)]
dic = {}
for i, j in tup:
    dic.setdefault(i,[]).append(j)
print(dic)
Syed Muhammad Zafar Rizvi
sumber
1
l=[['A', 1], ['B', 2], ['C', 3]]
d={}
for i,j in l:
d.setdefault(i,j)
print(d)
Seorang pria
sumber