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') ]
mike
sumber
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

Devin Jeanpierre
sumber
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')]
SilentGhost
sumber
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.

mpeterson
sumber
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)
Remi
sumber
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')]
>>> 
Barry Wark
sumber
6
[(k,v) for (k,v) in d.iteritems()]

dan

[(v,k) for (k,v) in d.iteritems()]
Robert Rossney
sumber
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)
Tessaracter
sumber
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')]
ismail
sumber
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')]
Vivek Sable
sumber
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
Harish
sumber
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.

Ketan
sumber