2009-11-05 22 views
111

Powiel możliwe:
How can I convert a Python dictionary to a list of tuples?Konwersja Python słownik do listy

Próbuję przekonwertować słownika Python do listy Python, aby wykonać kilka obliczeń.

#My dictionary 
dict = {} 
dict['Capital']="London" 
dict['Food']="Fish&Chips" 
dict['2012']="Olympics" 

#lists 
temp = [] 
dictList = [] 

#My attempt: 
for key, value in dict.iteritems(): 
    aKey = key 
    aValue = value 
    temp.append(aKey) 
    temp.append(aValue) 
    dictList.append(temp) 
    aKey = "" 
    aValue = "" 

To moja próba ... ale nie mogę się zorientować, co się dzieje?

+0

'suma (dict.items()())' – Natim

Odpowiedz

92

Twoim problemem jest to, że masz key i value w cudzysłów czyni je sznurki, to jesteś ustawienie aKey zawierać ciąg "key" a nie wartość zmiennej key. Nie wyczyszczasz też listy temp, więc dodajesz ją za każdym razem, zamiast tylko dwóch elementów.

Aby rozwiązać swój kod, spróbuj coś takiego:

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

Nie trzeba skopiować zmienne pętlowe key i value do innej zmiennej przed ich użyciem, więc rzuciłem je. Podobnie, nie musisz używać append do budowania listy, możesz po prostu określić ją w nawiasach kwadratowych, jak pokazano powyżej. I moglibyśmy zrobić dictlist.append([key,value]), gdybyśmy chcieli być jak najkrótsi.

Lub po prostu użyj dict.items(), jak zasugerowano.

+1

Prawidłowa odpowiedź z powodu wyjaśnienia, co robiłem źle . Jak możesz powiedzieć, jestem dość dobrze znany Pythonowi i wszelkie wyjaśnienia są bardzo doceniane. Twoje zdrowie! – Federer

+1

Jeśli używasz takich list append, tworzysz listę list. To, czego chciał, to płaska lista, dla której użyłbyś funkcji extend() jak w odpowiedzi Shaya. –

+1

Nigdy tego nie powiedział, Ajith. Lista list jest poprawną listą pythonów i znacznie lepszą interpretacją "słownika" niż płaską listą zawierającą tylko wartości nie będące listami. Lista list jest co najmniej w stanie pokazywać klucze i wartości, które są nadal pogrupowane. – codetaku

305
dict.items() 

Czy podstęp?

+7

Wiedziałem, że będzie jakiś śmieszny pythonowy sposób to zrobić, dziękuję bardzo istotnie. Po prostu uważam, że dokumentacja Pythona jest trudna do odczytania! – Federer

+12

@shylent Myślę, że miał na myśli to, jak w absurdalnie oczywistym/łatwym/pythonic – ofko

+1

Zawsze można użyć * help (dict) * w linii komend Pythona i zastąpić * dict * z kłopotliwym obiektem, aby zobaczyć listę jego pomocniczych metod itd. ., np * items (...) D.items() -> lista par D's (klucz, wartość), jako 2-krotne * –

19
>>> a = {'foo': 'bar', 'baz': 'quux', 'hello': 'world'} 
>>> list(reduce(lambda x, y: x + y, a.items())) 
['foo', 'bar', 'baz', 'quux', 'hello', 'world'] 

Aby wyjaśnić: a.items() zwraca listę krotek. Dodanie dwóch krotek tworzy jedną krotkę zawierającą wszystkie elementy. Zatem redukcja tworzy jedną krotkę zawierającą wszystkie klucze i wartości, a następnie lista (...) tworzy listę z tego.

+0

Interesujące ... Tam gdzieś można by użyć tego rodzaju scalenia. –

+1

Dla Pythona 3.^zamiast używać zmniejszenia, użyj functools.reduce –

10

Prawdopodobnie po prostu chcesz to:

dictList = dict.items() 

Twoje podejście ma dwa problemy. Dla jednej używasz key i value w cudzysłowach, które są ciągami z literami "klucz" i "wartość", niezwiązanymi ze zmiennymi tych nazw. Dodajesz również elementy do "tymczasowej" listy i nigdy nie pozbywasz się starych elementów, które są już w niej z poprzednich iteracji. Upewnij się, że masz nową, pustą listę temp w każdej iteracji i użyj key i value zmienne:

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

Należy również zauważyć, że może to być napisane krótszy bez zmiennych tymczasowych:

for key, value in dict.iteritems(): 
    dictList.append([key, value]) 
36

Powinieneś użyj dict.items().

Oto rozwiązanie jedna wkładka dla swojego problemu:

[(k,v) for k,v in dict.items()] 

i wynik:

[('Food', 'Fish&Chips'), ('2012', 'Olympics'), ('Capital', 'London')] 

czy można zrobić

l=[] 
[l.extend([k,v]) for k,v in dict.items()] 

dla:

['Food', 'Fish&Chips', '2012', 'Olympics', 'Capital', 'London'] 
+2

W python 2.6, przynajmniej, nie potrzebujesz dict.items(): '[(k, v) dla k, v w trybie dyktowania]'. – hughdbrown

+1

Python3.6 - '[x dla x in dict.items()]' robi to samo. – Blacksilver

2

Jeśli robisz słownika tylko zrobić listę krotek, jak tworzenie dicts jak ty może być ból, można zajrzeć do korzystania zip()

Jej Especialy przydatne jeśli masz jedną nagłówek i wiele wierszy. Na przykład, jeśli założymy, że chcesz statystyk olimpiady dla krajów:

headers = ['Capital', 'Food', 'Year'] 
countries = [ 
    ['London', 'Fish & Chips', '2012'], 
    ['Beijing', 'Noodles', '2008'], 
] 

for olympics in countries: 
    print zip(headers, olympics) 

daje

[('Capital', 'London'), ('Food', 'Fish & Chips'), ('Year', '2012')] 
[('Capital', 'Beijing'), ('Food', 'Noodles'), ('Year', '2008')] 

Nie wiem, czy to jest to cel końcowy, a mój jest off topic, ale może to być coś pamiętać.

127

Konwersja z dict do listy jest prosta w języku Python. Trzy przykłady:

>> d = {'a': 'Arthur', 'b': 'Belling'} 

>> d.items() 
[('a', 'Arthur'), ('b', 'Belling')] 

>> d.keys() 
['a', 'b'] 

>> d.values() 
['Arthur', 'Belling'] 
+0

Czy jest możliwe określenie kolejności 'values ​​()'?Czy kolejność wartości standardowego dyktatu jest nawet zdefiniowana? –

+2

@MichaelScheper [Nie określono kolejności polecenia standardowego] (http://stackoverflow.com/a/9001529/638546), a kolejność wartości może być inna niż kolejność wstawiania. Jednak można [sortować powyższe listy] (https://wiki.python.org/moin/HowTo/Sorting) lub użyć ** OrderedDict ** (zobacz pierwszy link). –