2012-10-16 11 views
78

Jestem nowy w Pythonie. Nie tylko poznaję jego funkcje, typy i tym podobne, ale także staram się poznać Pythoniczne sposoby robienia rzeczy, a zatem moje pytanie:Python dyktować, jak utworzyć klucz lub dołączyć element do klucza?

Mam pusty słownik. Imię i nazwisko: dict_x Ma klucze, których wartości to listy.

z oddzielnego iteracji I uzyskać klucz (np key_123), a element (krotka), aby umieścić na liście wartości dict_x „s key_123.

Jeśli ten klucz już istnieje, chcę dodać ten element. Jeśli ten klucz nie istnieje, chcę go utworzyć z pustą listą, a następnie dołączyć do niego lub po prostu utworzyć z krotką.

W przyszłości, gdy ponownie ten klucz pojawi się, ponieważ istnieje, chcę, aby wartość została ponownie dołączona.

Mój kod składa się z tego:

Zdobądź klucz i wartość.

Sprawdź, czy istnieje klucz NOT w dict_x.

a jeśli nie tworzyć go: dict_x[key] == []

potem: dict_x[key].append(value)

Jest to sposób to zrobić? Czy mam spróbować użyć bloków try/except?

Odpowiedz

126

Zastosowanie dict.setdefault():

dic.setdefault(key,[]).append(value) 

help (dict.setdefault):

setdefault(...) 
     D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D 
+3

kiedyś zrobić to przez 'dict_x [key] = [some_value] Jeżeli nie dict_x.has_key (key) innego dict_x [ key] + [some_value] ', ale ta odpowiedź sugeruje znacznie lepszy sposób. W rzeczywistości pobiera 'set()' jako argument i pozwala ci użyć metody 'add()' ... –

7

Można użyć defaultdict w collections.

Przykład z doc:

s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] 
d = defaultdict(list) 
for k, v in s: 
    d[k].append(v) 
5

Można użyć defaultdict do tego.

d = defaultdict(list) 
d['key'].append('mykey') 

ta jest nieco bardziej wydajny niż setdefault ponieważ nie kończy się tworzenie nowych list, że nie kończy się przy użyciu. Każde połączenie z numerem setdefault spowoduje utworzenie nowej listy, nawet jeśli element już istnieje w słowniku.

30

Oto różne sposoby, aby to zrobić, aby porównać wygląd i wybrać to, co lubisz.I zamówiłem je w sposób, który moim zdaniem jest najbardziej „pythonic” i skomentował zalety i wady, które mogą nie być oczywiste na pierwszy rzut oka:

Korzystanie collections.defaultdict:

import collections 
dict_x = collections.defaultdict(list) 

... 

dict_x[key].append(value) 

Zalety: Prawdopodobnie najlepsza wydajność. Wady: Niedostępne w Pythonie 2.4.x.

Stosując dict().setdefault():

dict_x = {} 

... 

dict_x.setdefault(key, []).append(value) 

Wady: Nieskuteczne tworzenie niewykorzystanych list() s.

Korzystanie try ... except:

dict_x = {} 

... 

try: 
    values = dict_x[key] 
except KeyError: 
    values = dict_x[key] = [] 
values.append(value) 

Lub:

try: 
    dict_x[key].append(value) 
except KeyError: 
    dict_x[key] = [value] 
+0

Witaj, dlaczego uważasz, że .setdefault tworzy niepotrzebne słowniki? – Phil

+1

Nie sądzę, że '.setdefault()' tworzy niepotrzebne słowniki. Myślę, że * ja * tworzę niepotrzebne 'list's (tj.' [] ') W drugim argumencie' .setdefault() ', który nigdy nie jest używany, jeśli' key' już istnieje. Mogłabym użyć 'dict.setdefault()' (na użytek wydajnego skrótu klawiszowego) i użyć zmiennej do ponownego użycia nieużywanych 'list's, ale to dodaje jeszcze kilka linii kodu. – antak

+0

IIRC, w Pythonie pusta lista w równości jest uważana za stałą na poziomie bajtodu, ale wymaga to potwierdzenia przez guru kodu bajtowego (lub po prostu skorzystania z modułu disas). – gaborous

Powiązane problemy