2009-08-05 15 views
30

szukam sposobu na konwersję listę krotek który wygląda tak:PYTHON: Konwertowanie listy krotek do słownika

[(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)] 

do słownika, gdzie klucz: wygląda para wartości tak:

{4:[1,2,3] ,15:[4,5,9,11,12], 23:[6,7,8,10]} 

Drugi element z krotki staje się kluczem słownika. Pierwszy element krotki jest przypisany do tego klucza.

Czy możesz mi pokazać, jak można to zrobić?

+1

Po co ma być lista słowników, w których każdy słownik ma tylko jeden klucz/wartość? Czy na pewno nie chcesz tylko jednego słownika? – FogleBird

+0

Tak, masz rację FogleBird. W końcu szukałem słownika. Dziękuję za wskazanie tego ... – elfuego1

+21

Sądząc po liczbie wyświetleń, większość osób (takich jak ja) znalazło się tutaj, szukając sposobu na konwersję 'myList = [(key1, val1), (key2, val2), ...] 'to a dict:' {key1: val1, key2: val2 ...} '. W tym celu po prostu wykonaj 'dykt (myList)' – mindthief

Odpowiedz

43
>>> from collections import defaultdict 
>>> l= [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)] 
>>> d= defaultdict(list) 
>>> for v, k in l: 
...  d[k].append(v) 
... 
>>> d 
defaultdict(<type 'list'>, {23: [6, 7, 8, 10], 4: [1, 2, 3], 15: [4, 5, 9, 11, 12]}) 
>>> [ {k:d[k]} for k in sorted(d) ] 
[{4: [1, 2, 3]}, {15: [4, 5, 9, 11, 12]}, {23: [6, 7, 8, 10]}] 
+0

+1 za używanie defaultdict. Dużo bardziej płynne niż wywoływanie 'setdefault()' za każdym razem. –

+0

Love collections.defaultdict. to moja najlepsza lekcja dla mnóstwa pracy. – hughdbrown

2
l = [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)] 
d = {} 
for v, k in l: 
    d.setdefault(k, []).append(v) 
+0

Kopiując moje użycie setdefault w twojej edycji, teraz jest mniej opcji dla wyborców do wyboru ... – FogleBird

+2

Naprawdę nie skopiowałem tego. Zdałem sobie sprawę, że mogę użyć setdefault również zaraz po opublikowaniu i zaktualizować go pocztą, ponieważ podobało mi się to lepiej. – c089

+0

Bez problemu. Poza tym nie jest źle, aby edytować i dodawać inne pomysły, ale zwykle robi się to, aby dodać więcej informacji, a nie tworzyć duplikatów odpowiedzi. Ale rozumiem, że nie skopiowałeś mojego. – FogleBird

2
tuples = [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)] 
dicts = {} 
for elem in tuples: 
    try: 
     dicts[elem[1]].append(elem[0]) 
    except KeyError: 
     dicts[elem[1]] = [elem[0],] 
+1

Użyj rozpakowywania w pętli for. Nie ma potrzeby stosowania przecinka na liście pojedynczych elementów (tylko krotki). A użycie tutaj wyjątku jest bardziej w porządku w Pythonie niż w innych językach, ale w tym przypadku jest trochę głupie. – FogleBird

+2

Wyjątek nie jest głupi - tak działa defaultdict. Zgadzam się na rozpakowanie. – xorsyst

12
>>> a = [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)] 
>>> b = {} 
>>> for i, j in a: 
...  b.setdefault(j, []).append(i) 
... 
>>> b 
{23: [6, 7, 8, 10], 4: [1, 2, 3], 15: [4, 5, 9, 11, 12]} 
>>> 
+0

Dziękuję bardzo! – elfuego1

+0

Genialny! Właśnie dzisiaj nauczyłem się nowej operacji dyktowania - setdefault. To trochę uporządkuje mój kod! Twoje zdrowie. +1 –

+3

@Steve Folly: spójrz na collections.defaultdict. Jest jeszcze lepiej. –

2

Będzie to zrobić:

from collections import defaultdict 

def to_list_of_dicts(list_of_tuples): 
    d = defaultdict(list) 
    for x, y in list_of_tuples: 
     d[y].append(x) 
    return sorted([{x: y} for (x, y) in d.items()]) 
2

To nie jest wyszukany, ale jest prosty

l = [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)] 
d = dict((k, [i[0] for i in l if i[1] == k]) for k in frozenset(j[1] for j in l)) 

huzzah!