2013-04-01 19 views
21

mam słownika PythonGrupowanie Python klucze słownika postaci listy i utworzyć nowy słownik z tej listy jako wartość

d = {1: 6, 2: 1, 3: 1, 4: 9, 5: 9, 6: 1} 

Ponieważ wartości w powyższej słowniku nie są unikatowe. Chcę grupować wszystkie klucze unikalnych wartości jako listy i utworzyć nowy słownik następująco:

v = {6:[1], 1:[2, 3, 6], 9: [4, 5]} 

Note klucze nowego słownika v powinny być posortowane. Trudno mi sobie wyobrazić i wdrożyć tworzenie tego słownika. Proszę, zasugeruj mi łatwy i skuteczny sposób na zrobienie tego.

Odpowiedz

32

Korzystanie collections.defaultdict dla ułatwienia:

from collections import defaultdict 

v = defaultdict(list) 

for key, value in sorted(d.iteritems()): 
    v[value].append(key) 

ale można zrobić z torfowiska standardzie dict TOO:

v = {} 

for key, value in sorted(d.iteritems()): 
    v.setdefault(value, []).append(key) 

W Pythonie 3, zamiast używać sorted(d.items()).

+1

Jeśli pójdziesz z defaultdict, ale nie chcą „default” zachowanie aby kontynuować po zainicjowaniu dyktowania, możesz ustawić atrybut 'default_factory' na' None'. Wtedy twój 'defaultdict' będzie zachowywał się jak zwykły dyktator prawie na każdy sposób. – mgilson

+0

Na marginesie, jestem wielkim fanem sposobu sortowania przedmiotów, a nie wartości, które byłyby najbardziej ludzkim (lub przynajmniej moim) pierwszym instynktem. +1. – mgilson

+0

Co to jest "lista" w drugiej linii? Wygląda na to, że zadziała po prostu 'v = defaultdict()' – clwen

10

Jeśli nie faktycznie potrzebują dict na koniec dnia, można użyć itertools.groupby:

from itertools import groupby 
from operator import itemgetter 

for k,v in groupby(sorted(d.items()),key=itemgetter(0)): 
    print k,list(v) 

Oczywiście, można to wykorzystać do skonstruowania dict jeśli naprawdę chciał:

{k:list(v) for k,v in groupby(sorted(d.items()),key=itemgetter(0))} 

Ale w tym momencie prawdopodobnie lepiej będzie użyć rozwiązania domyślnego Martijna.

+0

Twój słownik nie działa, a zamiast tego tworzy: '{1: [(1, 6)], 2: [(2, 1)], 3: [(3, 1)], 4: [(4, 9)], 5: [(5, 9)], 6: [(6, 1)]} ' – xApple

-1

Budowa sortuje wartości i dodaje się nowego słownika w istniejącej wartości klucza, inaczej pętla tworzy nowy klucz:

result = {} 
d = {1: 6, 2: 1, 3: 1, 4: 9, 5: 9, 6: 1} 

for i, j in sorted(d.items(), key=lambda x: x[1]): 
    if j not in result: 
     result.update({j: [i]}) 
    else: 
     result.update({j: result[j] + [i]}) 
+4

Wyjaśnij swoje odpowiedzi, proszę. – Blackbam

+1

Podaj nam więcej informacji. dzięki – Robert

+0

@Blackbam zaktualizowana odpowiedź – Frank

Powiązane problemy