python tuple untuk dict

149

Untuk tuple, t = ((1, 'a'),(2, 'b')) dict(t)kembali{1: 'a', 2: 'b'}

Apakah ada cara yang baik untuk mendapatkan {'a': 1, 'b': 2}(kunci dan vokal ditukar)?

Pada akhirnya, saya ingin dapat kembali 1diberikan 'a'atau 2diberikan 'b', mungkin mengkonversi ke dikt bukanlah cara terbaik.

Jake
sumber

Jawaban:

277

Mencoba:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict((y, x) for x, y in t)
{'a': 1, 'b': 2}
Greg Hewgill
sumber
8
+1 Cantik !, saya harus mencobanya dengan zip dict(zip(*zip(*t)[::-1])). Ini lebih lambat, lebih buruk dan menggunakan lebih banyak memori .. mungkin 3x.
kevpie
@ kevpie Hal yang luar biasa tentang Python adalah ada ratusan cara untuk mengekspresikan cara melakukan sesuatu, masing-masing sama menariknya dengan yang berikutnya.
bjd2385
Hebat, jika yang Anda miliki adalah triple, Anda dapat melakukannya: dict((x, y) for x, y, z in t)atau dict((x, (y, z)) for x, y, z in t)untuk mendapatkan nilai kedua dan ketiga sebagai tupel.
Persaingan
Sangat cepat, komprehensif, dan sederhana. Jawaban sempurna.
gies0r
73

Metode yang sedikit lebih sederhana:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict(map(reversed, t))
{'a': 1, 'b': 2}
jterrace
sumber
1
apa yang membuat ini lebih cepat?
maazza
9
Fungsi peta dan dict diimplementasikan dalam C dan jauh lebih cepat daripada versi python mana pun
jterrace
1
Saya suka ini karena memiliki reverseejaan yang dijabarkan.
Frerich Raabe
4
@maazza: secara umum, tes kinerja menunjukkan bahwa (dalam implementasi C setidaknya) maplebih cepat daripada pemahaman ketika hal yang dipetakan adalah fungsi built-in lain (seperti reversed); dalam kebanyakan kasus lain, yang terjadi adalah sebaliknya. Tetapi lebih baik profil daripada menebak :)
Karl Knechtel
43

Lebih ringkas jika Anda menggunakan python 2.7:

>>> t = ((1,'a'),(2,'b'))
>>> {y:x for x,y in t}
{'a':1, 'b':2}
autholykos
sumber
9
>>> dict([('hi','goodbye')])
{'hi': 'goodbye'}

Atau:

>>> [ dict([i]) for i in (('CSCO', 21.14), ('CSCO', 21.14), ('CSCO', 21.14), ('CSCO', 21.14)) ]
[{'CSCO': 21.14}, {'CSCO': 21.14}, {'CSCO': 21.14}, {'CSCO': 21.14}]
Gunnarsson
sumber
Saya tidak melihat bagaimana ini menjawab pertanyaan OP
Luca Amerio
4

Jika ada beberapa nilai untuk kunci yang sama, kode berikut akan menambahkan nilai-nilai itu ke daftar yang sesuai dengan kunci mereka,

d = dict()
for x,y in t:
    if(d.has_key(y)):
        d[y].append(x)
    else:
        d[y] = [x]
psun
sumber
2

Berikut adalah beberapa cara untuk melakukannya:

>>> t = ((1, 'a'), (2, 'b'))

>>> # using reversed function
>>> dict(reversed(i) for i in t)
{'a': 1, 'b': 2}

>>> # using slice operator
>>> dict(i[::-1] for i in t)
{'a': 1, 'b': 2}
Vlad Bezden
sumber