Znalazłem następujący słupek overflow Post o DICT Wymienia w Python2.7 i Python 3+: Utwórz słownik z rozumieniem listy w Python stwierdzając, że mogę zastosować wraz z tym względem stylu:

d = {key: value for (key, value) in sequence}

Próbowałem go w Pythonie 3. Jednak podnosi wyjątek.

d = {'a':1, 'b':2, 'c':3, 'd':4}
{key : value for (key, value) in d}
{key : value for key, value in d}

Oba wersje podnoszą ValueError mówiąc, że ValueError: need more than 1 value to unpack.

Jaki jest najłatwiejszy / najbardziej bezpośredni sposób na stworzenie ze zrozumieniem słownika w Python3?

34
Jon 10 grudzień 2013, 12:38

3 odpowiedzi

Najlepsza odpowiedź

Zapętle nad słownikiem daje tylko klucze . Użyj d.items(), aby pętli na obu klawiszach i wartościach:

{key: value for key, value in d.items()}

Wyjątek ValueError Szczegóły Zobaczysz ten sam problem w Pythonie 2 lub z regularnym for pętla:

>>> d = {'a':1, 'b':2, 'c':3, 'd':4}
>>> for key, value in d:
...     print key, value
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 1 value to unpack

Ponieważ każda iteracja jest tylko One przedmiot.

Bez transformacji {k: v for k, v in d.items()} jest tylko gadankowym i kosztownym d.copy(); Użyj dict zrozumienia tylko wtedy, gdy robisz trochę więcej za pomocą kluczy lub wartości, lub użyć warunków lub bardziej złożonej konstrukcji pętli.

55
Martijn Pieters 10 grudzień 2013, 08:39

Dobrze powiedziane powyżej - możesz upuścić elementy w Python3, jeśli to zrobisz w ten sposób:

{Klucz: D [Klucz] dla klucza w D}

d = {'a':1, 'b':2, 'c':3, 'd':4}
z = {x: d[x] for x in d}
z
>>>{'a': 1, 'b': 2, 'c': 3, 'd': 4}

I zapewnia również możliwość korzystania z warunków

y = {x: d[x] for x in d if d[x] > 1}
y
>>>{'b': 2, 'c': 3, 'd': 4}

Cieszyć się!

11
Gyrth Fischer 31 marzec 2017, 20:29

Szumienia słownika oznacza wytwarzanie elementów w słowniku przez niektóre logikę:

x = {p: p*p for p in range(10)}

print(x)

y = {q: q*3 for q in range(5,15) if q%2!=0}

print(y)
1
Nagendra 21 kwiecień 2019, 20:16