Jak przekonwertować słownik na listę krotek?

219

Jeśli mam słownik taki jak:

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

Jak mogę to przekonwertować na to?

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

Jak mogę na to przekonwertować?

[ (1, 'a'), (2, 'b'), (3, 'c') ]
mikrofon
źródło
7
[tuple(reversed(x)) for x in d.items()]
garej
1
@garej: Biorąc pod uwagę, że xjest już tuplew kodzie (jest to charakter itemsiterowalny z tuples), byłoby łatwiej / szybciej to zrobić [x[::-1] for x in d.items()]; wycinek odwracający bezpośrednio konstruuje odwrotność tupleo odpowiedniej wielkości, zamiast tupleiteracyjnego wypełniania przez konstruktora (z ogólną alokacją i zmianą rozmiaru na końcu) a tuplez reversediteratora.
ShadowRanger
@ShadowRanger, masz rację. Chciałem tylko wyraźnie powiedzieć, że k, vw takich przypadkach nie zawsze potrzeba wzorca.
garej
Uwaga: dodano compatibilitytag z powodu różnic py2.x // py3.x
dreftymac

Odpowiedzi:

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

Nie jest w pożądanej kolejności, ale dyktanda i tak nie mają żadnej określonej kolejności. 1 Sortuj lub organizuj w razie potrzeby.

Zobacz: items () , iteritems ()


W Pythonie 3.x nie używałbyś iteritems(który już nie istnieje), ale zamiast tego używałbyś items, który teraz zwraca „widok” do elementów słownika. Zobacz dokument Co nowego w Pythonie 3.0 i nową dokumentację dotyczącą widoków .

1: Zachowanie kolejności wstawiania dla nagrań zostało dodane w Pythonie 3.7

Devin Jeanpierre
źródło
8
items () zwraca widok dict_keys w python3. Zawiń to wywołanie rzutowaniem na listę „list ()”. Zobacz odpowiedź @ SilentGhost
Erich,
55

ponieważ nikt inny tego nie zrobił, dodam wersje 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
źródło
18

Możesz użyć wyrażeń listowych.

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

dostanie cię [ ('a', 1), ('b', 2), ('c', 3) ]i

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

drugi przykład.

Przeczytaj więcej o opisach list, jeśli chcesz, to bardzo interesujące, co możesz z nimi zrobić.

mpeterson
źródło
10

Utwórz listę nazwanych świątyń

Korzystanie z namedtuple często może być bardzo przydatne . Na przykład masz słownik „nazwa” jako klucze i „wynik” jako wartości takie jak:

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

Możesz wymienić elementy jako krotki, posortowane według własnego uznania, a także uzyskać nazwę i wynik, powiedzmy, gracz z najwyższym wynikiem (indeks = 0) bardzo pythonicznie:

>>> player = best[0]

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

Jak to zrobić:

lista w losowej kolejności lub w porządku kolekcji.OrDERDict :

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

w kolejności, posortowane według wartości („wynik”):

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

posortowane z najniższą oceną:

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

posortowane najpierw z najwyższym wynikiem:

best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)
Remi
źródło
7

Co chcesz, to dict„s items()i iteritems()metody. itemszwraca listę krotek (klucz, wartość). Ponieważ krotki są niezmienne, nie można ich odwrócić. Dlatego musisz iterować elementy i tworzyć nowe krotki, aby uzyskać odwrócone krotki (wartość, klucz). W przypadku iteracji iteritemspreferowane jest użycie generatora do generowania krotek (klucz, wartość) zamiast utrzymywania całej listy w pamięci.

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
źródło
6
[(k,v) for (k,v) in d.iteritems()]

i

[(v,k) for (k,v) in d.iteritems()]
Robert Rossney
źródło
7
„[(k, v) dla (k, v) w d.iteritems ()]” jest strasznym odpowiednikiem d.items ()
Devin Jeanpierre
5

Są to przełomowe zmiany w porównaniu z Python 3.x i Python 2.x

Do użytku w Python3.x.

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

Do użytku w Pythonie 2.7

dictlist = []
for key, value in dict.iteritems():
    temp = [key,value]
    dictlist.append(temp)
Tessaracter
źródło
4
>>> a = {'a': 1, 'b': 2, 'c': 3}

>>> [(x, a [x]) dla x w klawiszach a ()]
[(„a”, 1), („c”, 3), („b”, 2)]

>>> [(a [x], x) dla x w klawiszach a ()]
[(1, „a”), (3, „c”), (2, „b”)]
ismail
źródło
4

Przez keys()i values()metody słownika i zip.

zip zwróci listę krotek, która działa jak uporządkowany słownik.

Próbny:

>>> 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
źródło
collections.OrderedDict()Działa to dla mnie jako alternatywa dla tej, która działa lepiej z wieloma wersjami lib Python HTTP Requests. Mimo że nie podoba mi się zipnazwa funkcji jako nieco niejasna / przeciążona.
MarkHu
Zauważ, że zip-ifikacja nie jest „głębokim” rzutem, tzn. Jeśli są zagnieżdżone dzieci, nie będzie to miało wpływu. Być może będziesz musiał rzucić własną rekurencję.
MarkHu
3
d = {'John':5, 'Alex':10, 'Richard': 7}
list = []
for i in d:
   k = (i,d[i])
   list.append(k)

print list
Harish
źródło
2
Chociaż ten kod może pomóc w rozwiązaniu problemu, nie wyjaśnia, dlaczego i / lub jak odpowiada na pytanie. Zapewnienie tego dodatkowego kontekstu znacznie poprawiłoby jego długoterminową wartość edukacyjną. Proszę edytować swoje odpowiedzi, aby dodać wyjaśnienie, w tym, co stosuje się ograniczenia i założenia.
Toby Speight
3

Byłoby to prostsze

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

Drugi nie jest wcale prostszy, ale tak.

Ketan
źródło