Bagaimana saya bisa mengubah kamus menjadi daftar tupel?


218

Jika saya memiliki kamus seperti:

{ 'a': 1, 'b': 2, 'c': 3 }

Bagaimana saya bisa mengubahnya menjadi ini?

[ ('a', 1), ('b', 2), ('c', 3) ]

Dan bagaimana saya bisa mengubahnya menjadi ini?

[ (1, 'a'), (2, 'b'), (3, 'c') ]

7
[tuple(reversed(x)) for x in d.items()]
garej

1
@ garej: Diberikan xsudah ada tupledalam kode Anda (itu sifat itemsuntuk menghasilkan iterable dari tuples), itu akan lebih mudah / lebih cepat untuk dilakukan [x[::-1] for x in d.items()]; irisan pembalik secara langsung membangun kebalikan tupledari ukuran yang tepat daripada memiliki tuplekonstruktor yang berulang-ulang (dengan keseluruhan lokasi dan ukuran pada akhirnya) a tupledari reversediterator.
ShadowRanger

@ShadowRanger, kamu benar. Saya hanya ingin menjadi eksplisit bahwa tidak selalu diperlukan k, vpola dalam kasus seperti itu.
garej

Catatan: menambahkan compatibilitytag karena py2.x // py3.x perbedaan
dreftymac

Jawaban:


360
>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> d.items()
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v, k) for k, v in d.iteritems()]
[(1, 'a'), (3, 'c'), (2, 'b')]

Ini bukan dalam urutan yang Anda inginkan, tetapi dikte tidak memiliki urutan tertentu. 1 Urutkan atau atur jika perlu.

Lihat: item () , iteritems ()


Dalam Python 3.x, Anda tidak akan menggunakan iteritems(yang sudah tidak ada lagi), melainkan menggunakannya items, yang sekarang mengembalikan "tampilan" ke dalam item kamus. Lihat dokumen What's New untuk Python 3.0, dan dokumentasi baru tentang pandangan .

1: Pelestarian penyisipan-urutan untuk dikte ditambahkan dalam Python 3.7


7
items () mengembalikan tampilan dict_keys di python3. Bungkus panggilan ini dengan para pemain ke daftar "list ()". Lihat @ balasan SilentGhost
Erich

54

karena tidak ada orang lain yang melakukannya, saya akan menambahkan versi py3k:

>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> list(d.items())
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v, k) for k, v in d.items()]
[(1, 'a'), (3, 'c'), (2, 'b')]

18

Anda dapat menggunakan pemahaman daftar.

[(k,v) for k,v in a.iteritems()] 

akan membuat Anda [ ('a', 1), ('b', 2), ('c', 3) ]dan

[(v,k) for k,v in a.iteritems()] 

contoh lainnya.

Baca lebih lanjut tentang pemahaman daftar jika Anda suka, sangat menarik apa yang dapat Anda lakukan dengannya.


10

Buat daftar namesupuple

Seringkali bisa sangat berguna untuk menggunakan namesuple . Misalnya, Anda memiliki kamus 'nama' sebagai kunci dan 'nilai' sebagai nilai-nilai seperti:

d = {'John':5, 'Alex':10, 'Richard': 7}

Anda dapat membuat daftar item sebagai tupel, diurutkan jika Anda suka, dan mendapatkan nama dan skor, katakanlah pemain dengan skor tertinggi (indeks = 0) dengan sangat Pythonically seperti ini:

>>> player = best[0]

>>> player.name
        'Alex'
>>> player.score
         10

Bagaimana cara melakukannya:

daftar dalam urutan acak atau menjaga urutan koleksi. OrderedDict :

import collections
Player = collections.namedtuple('Player', 'name score')
players = list(Player(*item) for item in d.items())

dalam urutan, diurutkan berdasarkan nilai ('skor'):

import collections
Player = collections.namedtuple('Player', 'score name')

diurutkan dengan skor terendah terlebih dahulu:

worst = sorted(Player(v,k) for (k,v) in d.items())

diurutkan dengan skor tertinggi pertama:

best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)

7

Apa yang Anda inginkan adalah dict's items()dan iteritems()metode. itemsmengembalikan daftar tupel (kunci, nilai). Karena tupel tidak berubah, tupel tidak dapat dibalik. Dengan demikian, Anda harus mengulang item dan membuat tupel baru untuk mendapatkan tupel yang terbalik (nilai, kunci). Untuk iterasi, iteritemslebih disukai karena menggunakan generator untuk menghasilkan tuple (kunci, nilai) daripada harus menyimpan seluruh daftar dalam memori.

Python 2.5.1 (r251:54863, Jan 13 2009, 10:26:13) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = { 'a': 1, 'b': 2, 'c': 3 }
>>> a.items()
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v,k) for (k,v) in a.iteritems()]
[(1, 'a'), (3, 'c'), (2, 'b')]
>>> 

6
[(k,v) for (k,v) in d.iteritems()]

dan

[(v,k) for (k,v) in d.iteritems()]

7
"[(k, v) untuk (k, v) dalam d.iteritems ()]" adalah setara dengan d.items ()
Devin Jeanpierre

5

Ini adalah perubahan yang melanggar dari Python 3.x dan Python 2.x

Untuk penggunaan Python3.x

dictlist = []
for key, value in dict.items():
    temp = [key,value]
    dictlist.append(temp)

Untuk penggunaan Python 2.7

dictlist = []
for key, value in dict.iteritems():
    temp = [key,value]
    dictlist.append(temp)

4
>>> a = {'a': 1, 'b': 2, 'c': 3}

>>> [(x, a [x]) untuk x di a.keys ()]
[('a', 1), ('c', 3), ('b', 2)]

>>> [(a [x], x) untuk x di a.keys ()]
[(1, 'a'), (3, 'c'), (2, 'b')]

4

Dengan keys()dan values()metode kamus dan zip.

zip akan mengembalikan daftar tupel yang berfungsi seperti kamus yang dipesan.

Demo:

>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> zip(d.keys(), d.values())
[('a', 1), ('c', 3), ('b', 2)]
>>> zip(d.values(), d.keys())
[(1, 'a'), (3, 'c'), (2, 'b')]

Ini berfungsi bagi saya sebagai alternatif untuk collections.OrderedDict()yang bekerja lebih baik dengan beberapa versi lib Permintaan HTTP Python. Meskipun saya tidak suka zipnama fungsi yang agak kabur / kelebihan.
MarkHu

Catatan zip-ifikasi bukan casting "dalam", yaitu jika ada anak-anak bersarang, mereka tidak akan terpengaruh. Anda mungkin harus memutar rekursi Anda sendiri.
MarkHu

3
d = {'John':5, 'Alex':10, 'Richard': 7}
list = []
for i in d:
   k = (i,d[i])
   list.append(k)

print list

2
Meskipun kode ini dapat membantu menyelesaikan masalah, kode ini tidak menjelaskan mengapa dan / atau bagaimana ia menjawab pertanyaan. Memberikan konteks tambahan ini akan secara signifikan meningkatkan nilai pendidikan jangka panjangnya. Harap edit jawaban Anda untuk menambahkan penjelasan, termasuk batasan dan asumsi apa yang berlaku.
Toby Speight

2

Yang lebih sederhana adalah

list(dictionary.items())  # list of (key, value) tuples
list(zip(dictionary.values(), dictionary.keys()))  # list of (key, value) tuples

Yang kedua tidak sederhana tapi ya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.