Czy w Pythonie można utworzyć słownikowe rozumienie (dla kluczy)?
Bez zrozumienia listy możesz użyć czegoś takiego:
l = []
for n in range(1, 11):
l.append(n)
Możemy skrócić to do listowego: l = [n for n in range(1, 11)]
.
Powiedzmy jednak, że chcę ustawić klucze słownika na tę samą wartość. Potrafię:
d = {}
for n in range(1, 11):
d[n] = True # same value for each
Próbowałem tego:
d = {}
d[i for i in range(1, 11)] = True
Jednak dostaję SyntaxError
na for
.
Ponadto (nie potrzebuję tej części, tylko się zastanawiam), czy możesz ustawić klucze słownika na kilka różnych wartości, takich jak to:
d = {}
for n in range(1, 11):
d[n] = n
Czy jest to możliwe dzięki zrozumieniu słownika?
d = {}
d[i for i in range(1, 11)] = [x for x in range(1, 11)]
To również podnosi SyntaxError
na for
.
python
dictionary
list-comprehension
Rushy Panchal
źródło
źródło
Odpowiedzi:
W Pythonie 2.7+ istnieją wyrażenia słownikowe , ale nie działają one tak, jak próbujesz. Podobnie jak listy, tworzą nowy słownik; nie można ich używać do dodawania kluczy do istniejącego słownika. Musisz także określić klucze i wartości, choć oczywiście możesz podać wartość zastępczą, jeśli chcesz.
Jeśli chcesz ustawić je wszystkie na True:
Wygląda na to, że pytasz o sposób ustawienia wielu kluczy jednocześnie w istniejącym słowniku. Nie ma do tego bezpośredniego skrótu. Możesz albo zapętlić, jak już pokazałeś, lub użyć słownika, aby utworzyć nowy słownik z nowymi wartościami, a następnie
oldDict.update(newDict)
scalić nowe wartości ze starym.źródło
dict.update
może również akceptować iterowalne pary klucz-wartość, podobnie jakdict
konstruktordict.fromkeys()
. Aby ustawić wszystkie wartościTrue
, użyjdict.fromkeys(range(5), True)
. Uważaj, wartość nie jest kopiowana , więc możesz tego uniknąć, jeśli masz zmienną wartość; zostanie udostępniony między wszystkimi kluczami.{ n*2 : n for n in range(3) } => {0: 0, 2: 1, 4: 2}
. Oba mogą być wykonane w tym samym wyrażeniu:{ n*2 : n*3 for n in range(3) } => { 0: 0, 2: 3, 4: 6 }
.Możesz użyć
dict.fromkeys
metody klasowej ...Jest to najszybszy sposób na utworzenie słownika, w którym wszystkie klucze są odwzorowane na tę samą wartość.
Ale czy nie skorzystać z tego modyfikowalnych obiektów :
Jeśli tak naprawdę nie musisz inicjować wszystkich kluczy,
defaultdict
przydatne może być również:Aby odpowiedzieć na drugą część, zrozumienie dykta jest właśnie tym, czego potrzebujesz:
Prawdopodobnie nie powinieneś tego robić, ale możesz także utworzyć podklasę,
dict
która działa podobnie jak a,defaultdict
jeśli przesłonisz__missing__
:źródło
d = defaultdict(lambda: True)
lambda nie jest wymagane, ponieważ prawda jest (lub nie powinna) być zmienna.źródło
Naprawdę podoba mi się komentarz @mgilson, ponieważ jeśli masz dwie iterowalne, jedną, która odpowiada kluczom, a drugą wartości, możesz również wykonać następujące czynności.
dający
źródło
{i:j for i in keys for j in values}
Użyj dict () na liście krotek, to rozwiązanie pozwoli ci mieć dowolne wartości na każdej liście, o ile są one tej samej długości
źródło
d = dict(zip(i_s,x_s))
Rozważ ten przykład liczenia występowania słów na liście przy użyciu słownika
I wynik jest taki
źródło
Głównym celem zrozumienia listy jest utworzenie nowej listy opartej na innej, bez zmiany lub zniszczenia oryginalnej listy.
Zamiast pisać
lub
powinieneś pisać tylko
W dwóch najlepszych blokach kodu tworzysz nową listę, iterując ją i zwracając każdy element. To po prostu drogi sposób na utworzenie kopii listy.
Aby uzyskać nowy słownik ze wszystkimi kluczami ustawionymi na tę samą wartość na podstawie innego słownika, wykonaj następujące czynności:
Otrzymujesz błąd SyntaxError, ponieważ podczas pisania
w zasadzie mówisz: „Ustaw mój klucz” i dla i w zakresie (1, 11) na „Prawda”, a „i dla i w zakresie (1, 11)” nie jest prawidłowym kluczem, to tylko błąd składniowy. Jeśli dyktuje obsługiwane listy jako klucze, zrobiłbyś coś takiego
i nie
ale list nie można mieszać, więc nie można ich używać jako klawiszy dyktowania.
źródło
nie możesz haszować takiej listy. spróbuj tego zamiast tego, używa krotek
źródło