Bir sözlüğü tuples listesine nasıl dönüştürebilirim?


219

Ben gibi bir sözlük varsa:

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

Bunu buna nasıl dönüştürebilirim?

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

Ve bunu buna nasıl dönüştürebilirim?

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

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

1
@garej: Verilen kodunuzda xzaten bir tuple( itemsbir yinelenebilir tuples üretmenin doğası ), sadece yapmak daha basit / daha hızlı olurdu [x[::-1] for x in d.items()]; ters dilim doğrudan ters inşa tupleyerine sahip olan daha uygun büyüklükte tuplebir iteratif doldurmak kurucu (overallocation ve sonunda yeniden boyutlandırma) tuplebir mesafede reversedyineleyici.
ShadowRanger

@ShadowRanger, haklısın. Sadece bu k, vgibi durumlarda her zaman örüntüye ihtiyaç olmadığını açıkça belirtmek istedim .
garej

Not:compatibility py2.x // py3.x farklılıkları nedeniyle etiket eklendi
dreftymac

Yanıtlar:


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

İstediğiniz sırayla değil, ancak diktelerin zaten belirli bir sırası yok. 1 Sıralayın veya gerektiği gibi düzenleyin.

Bkz: öğeler () , iteritems ()


Python 3.x'te, iteritems(artık mevcut olmayan) kullanmazsınız items, bunun yerine artık sözlük öğelerine bir "görünüm" döndüren kullanın . Bkz Yenilikler Python 3.0 için belge ve yeni görünümler belgelerine .

1: Dikteler için ekleme emri koruması Python 3.7'de eklendi


8
items (), python3'te bir dict_keys görünümü döndürür. Bu aramayı "list ()" listesine yayınla sarın. @ SilentGhost'un cevabı
Erich

55

başka kimse yapmadığı için py3k sürümleri ekleyeceğim:

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


10

Adlandırılmış başlıkların bir listesini oluşturun

Namedtuple kullanmak genellikle çok kullanışlı olabilir . Örneğin, anahtarlar olarak 'ad' sözlüğüne ve aşağıdaki gibi değerler olarak 'puan' sözlüğüne sahipsiniz:

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

Öğeleri tuples olarak listeleyebilir, isterseniz sıralayabilir ve adını ve puanını alabilirsiniz, diyelim ki en yüksek puana (index = 0) sahip oyuncu Pythonically şöyle:

>>> player = best[0]

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

Bu nasıl yapılır:

rastgele veya sırasını tutmada liste collections.OrderedDict :

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

sırayla, değere göre sıralanmıştır ('skor'):

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

önce en düşük puanla sıralandı:

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

önce en yüksek puanla sıralandı:

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

7

İstediğin ise dict'ler items()ve iteritems()yöntemler. items(anahtar, değer) gruplarının listesini döndürür. Tupller değişmez olduğu için tersine çevrilemezler. Böylece, öğeleri yinelemek ve ters (değer, anahtar) tuples almak için yeni tuples oluşturmak zorunda. Yineleme iteritemsiçin, tüm listeyi bellekte tutmak yerine (anahtar, değer) tuples üretmek için bir jeneratör kullandığından tercih edilir.

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


5

Bunlar Python 3.x ve Python 2.x'teki değişiklikler

Python3.x kullanımı için

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

Python 2.7 kullanımı için

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

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

a.keys () içindeki x için >>> [(x, a [x])
[('a', 1), ('c', 3), ('b', 2)]

a.keys () içindeki x için >>> [(a [x], x)
[(1, 'a'), (3, 'c'), (2, 'b')]

4

Tarafından keys()ve values()sözlük ve yöntemleri zip.

zip sıralı sözlük gibi davranan bir grup listesini döndürür.

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

Bu benim için bir alternatif olarak collections.OrderedDict()Python HTTP İstekleri lib'in birden çok sürümü ile daha iyi çalışır. zipİşlev adını biraz belirsiz / aşırı yüklenmiş olarak sevmeme rağmen .
MarkHu

Not: zip-ifikasyon "derin" bir döküm değildir, yani yuvalanmış çocuklar varsa, etkilenmeyecektir. Kendi özyinelemenizi atmanız gerekebilir.
MarkHu

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

print list

2
Bu kod sorunu çözmeye yardımcı olsa da , soruyu neden ve / veya nasıl cevapladığını açıklamaz . Bu ek bağlamın sağlanması, uzun vadeli eğitim değerini önemli ölçüde artıracaktır. Hangi sınırlamalar ve varsayımlar dahil olmak üzere açıklama eklemek için lütfen yanıtınızı düzenleyin .
Toby Speight

3

Daha basit olan

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

İkincisi daha basit değil, evet.

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.