Iteracja słowników za pomocą pętli 'for'

Jestem nieco zdziwiony poniższym kodem:

d = {'x': 1, 'y': 2, 'z': 3} 
for key in d:
    print (key, 'corresponds to', d[key])

To czego nie rozumiem to key część. Jak Python rozpoznaje, że potrzebuje tylko odczytać klucz ze słownika? Czy key jest specjalnym słowem w Pythonie? Czy jest to po prostu zmienna?

Author: cs95, 2010-07-20

13 answers

key jest tylko nazwą zmiennej.

for key in d:

Po prostu zapętli klucze w słowniku, a nie klucze i wartości. Aby zapętlić zarówno klucz, jak i wartość, możesz użyć następującego polecenia:

Dla Pythona 3.x:

for key, value in d.items():

Dla Pythona 2.x:

for key, value in d.iteritems():

Aby sprawdzić dla siebie, Zmień słowo key na poop.

W Pythonie 3.x, iteritems() został zastąpiony przez po prostu items(), co zwraca widok podobny do zestawu wspierany przez dict, jak iteritems(), ale jeszcze lepszy. To jest dostępny również w wersji 2.7 jako viewitems().

Operacja items() będzie działać zarówno dla 2 jak i 3, ale w 2 zwróci listę par (key, value) słownika, które nie będą odzwierciedlać zmian w dict, które nastąpią po wywołaniu items(). Jeśli chcesz 2.x zachowanie w 3.x, możesz zadzwonić list(d.items()).

 5743
Author: sberry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-03 05:46:19

Nie chodzi o to, że klucz jest specjalnym słowem, ale o to, że słowniki implementują protokół iteratora. Możesz to zrobić w swojej klasie, np. zobacz to pytanie Jak budować Iteratory klas.

W przypadku słowników jest zaimplementowany na poziomie C. Szczegóły są dostępne w PEP 234 . W szczególności sekcja zatytułowana "Iteratory słownikowe":

  • Słowniki implementują slot tp_iter, który zwraca efektywną iterator to iteruje nad kluczami słownika. [...] To oznacza, że możemy napisać

    for k in dict: ...
    

    Co jest równoważne, ale znacznie szybsze niż

    for k in dict.keys(): ...
    

    O ile ograniczenie zmian w słowniku (albo przez pętlę, albo przez inny wątek) nie są naruszane.

  • Dodawanie metod do słowników zwracających różne rodzaje Iteratory:

    for key in dict.iterkeys(): ...
    
    for value in dict.itervalues(): ...
    
    for key, value in dict.iteritems(): ...
    

    Oznacza to, że for x in dict jest skrótem od for x in dict.iterkeys().

W Pythonie 3, dict.iterkeys(), dict.itervalues() i dict.iteritems() nie są już obsługiwane. Użycie dict.keys(), dict.values() i dict.items() zamiast tego.

 476
Author: ars,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-30 00:11:40

Iteracja nad dict iteracja przez klucze w żadnej konkretnej kolejności, jak widać tutaj:

(to jest nie ma już sprawy w Pythonie 3.6, ale zauważ, że to nie jest jeszcze gwarantowane zachowanie.)

>>> d = {'x': 1, 'y': 2, 'z': 3}
>>> list(d)
['y', 'x', 'z']
>>> d.keys()
['y', 'x', 'z']

Dla Twojego przykładu lepszym pomysłem jest użycie dict.items():

>>> d.items()
[('y', 2), ('x', 1), ('z', 3)]

To daje listę krotek. Gdy zapętlisz je w ten sposób, każda krotka jest rozpakowana do k i v automatycznie:

for k,v in d.items():
    print(k, 'corresponds to', v)

Za pomocą k i v jako nazwy zmiennych, gdy pętla nad dict jest dość powszechna, jeśli ciało pętli składa się tylko z kilku linii. W przypadku bardziej skomplikowanych pętli dobrym pomysłem może być użycie bardziej opisowych nazw:

for letter, number in d.items():
    print(letter, 'corresponds to', number)

Dobrym pomysłem jest przyzwyczajenie się do używania ciągów formatujących:

for letter, number in d.items():
    print('{0} corresponds to {1}'.format(letter, number))
 228
Author: John La Rooy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-13 05:05:24

key jest po prostu zmienną.

Dla Python2.X :

d = {'x': 1, 'y': 2, 'z': 3} 
for my_var in d:
    print my_var, 'corresponds to', d[my_var]

... albo lepiej,

d = {'x': 1, 'y': 2, 'z': 3} 
for the_key, the_value in d.iteritems():
    print the_key, 'corresponds to', the_value

Dla Python3.X :

d = {'x': 1, 'y': 2, 'z': 3} 
for the_key, the_value in d.items():
    print(the_key, 'corresponds to', the_value)
 96
Author: ssoler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-15 10:51:39

W przypadku iteracji przez słowniki przy użyciu składni for .. in .., zawsze iteracja odbywa się nad kluczami (wartości są dostępne przy użyciu dictionary[key]).

Do iteracji par klucz-wartość, w Pythonie 2 Użyj for k,v in s.iteritems(), a w Pythonie 3 for k,v in s.items().

 68
Author: Alexander Gessler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-24 13:41:02

Jest to bardzo popularny idiom pętli. in jest operatorem. Aby dowiedzieć się, kiedy używać for key in dict i kiedy musi być for key in dict.keys() Zobacz David Goodger ' s idiomatic Python article (archived copy).

 37
Author: chryss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-24 13:52:59

Iteracja słowników za pomocą pętli ' for '

d = {'x': 1, 'y': 2, 'z': 3} 
for key in d:
    ...

Jak Python rozpoznaje, że potrzebuje tylko odczytać klucz z słownik? Czy key to specjalne słowo w Pythonie? Czy jest to po prostu zmienna?

To nie tylko for pętle. Ważne słowo to "iteracja".

Słownik jest odwzorowaniem kluczy do wartości:

d = {'x': 1, 'y': 2, 'z': 3} 

Za każdym razem, gdy nad nim iterujemy, iterujemy nad kluczami. Nazwa zmiennej key jest przeznaczona tylko być opisowym - i to jest całkiem trafne do celu.

Dzieje się tak w pojęciu listy:

>>> [k for k in d]
['x', 'y', 'z']

Dzieje się tak, gdy przekazujemy słownik do list (lub dowolnego innego obiektu typu collection):

>>> list(d)
['x', 'y', 'z']
W Pythonie, w kontekście, w którym jest to konieczne, wywołana jest metoda __iter__ obiektu (w tym przypadku słownika), który zwraca iterator (w tym przypadku obiekt keyiterator):
>>> d.__iter__()
<dict_keyiterator object at 0x7fb1747bee08>

Nie powinniśmy używać tych specjalnych metod sami, zamiast tego użyj odpowiedniej wbudowanej funkcji, aby ją wywołać, iter:

>>> key_iterator = iter(d)
>>> key_iterator
<dict_keyiterator object at 0x7fb172fa9188>

Iteratory mają metodę __next__ - ale nazywamy ją wbudowaną funkcją, next:

>>> next(key_iterator)
'x'
>>> next(key_iterator)
'y'
>>> next(key_iterator)
'z'
>>> next(key_iterator)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
Kiedy iterator jest wyczerpany, podnosi się StopIteration. W ten sposób Python potrafi wyjść z pętli for, ze zrozumieniem listy, wyrażeniem generatora lub innym kontekstem iteracyjnym. Gdy iterator podniesie StopIteration, zawsze go podniesie - jeśli chcesz ponownie iterację, potrzebujesz nowego jeden.
>>> list(key_iterator)
[]
>>> new_key_iterator = iter(d)
>>> list(new_key_iterator)
['x', 'y', 'z']

Powrót do dicts

Widzieliśmy iterację dictów w wielu kontekstach. Widzieliśmy, że za każdym razem, gdy powtarzamy dyktafon, dostajemy klucze. Powrót do oryginalnego przykładu:

d = {'x': 1, 'y': 2, 'z': 3} 
for key in d:

Jeśli zmienimy nazwę zmiennej, nadal otrzymamy klucze. Spróbujmy:

>>> for each_key in d:
...     print(each_key, '=>', d[each_key])
... 
x => 1
y => 2
z => 3

Jeśli chcemy iterować nad wartościami, musimy użyć metody .values dicts, lub dla obu razem, .items:

>>> list(d.values())
[1, 2, 3]
>>> list(d.items())
[('x', 1), ('y', 2), ('z', 3)]

W podanym przykładzie byłoby bardziej wydajne iteracje nad przedmiotami takimi jak:

for a_key, corresponding_value in d.items():
    print(a_key, corresponding_value)

Ale dla celów akademickich, przykład pytania jest w porządku.

 24
Author: Aaron Hall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-21 02:51:51

Mam przypadek użycia, w którym muszę iterować przez dict, aby uzyskać klucz, parę wartości, a także indeks wskazujący, gdzie jestem. Tak to robię:

d = {'x': 1, 'y': 2, 'z': 3} 
for i, (key, value) in enumerate(d.items()):
   print(i, key, value)

Zauważ, że nawiasy wokół klucza, wartość jest ważna, bez nawiasów, otrzymasz ValueError "za mało wartości do rozpakowania".

 22
Author: jdhao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-02 15:37:54

Możesz sprawdzić implementację dicttype Cpythona na Githubie. Jest to sygnatura metody implementującej iterator dict:

_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
             PyObject **pvalue, Py_hash_t *phash)

CPython dictobject.c

 10
Author: Ankur Agarwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-19 18:38:01

To wyświetli wyjście w posortowane w kolejności według wartości w kolejności rosnącej.

d = {'x': 3, 'y': 1, 'z': 2}

def by_value(item):
    return item[1]

for key, value in sorted(d.items(), key=by_value):
    print(key, '->', value)

Wyjście:

Tutaj wpisz opis obrazka

 6
Author: Amar Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-13 05:07:39

Aby iterować nad kluczami, jest wolniejsze, ale lepiej używać my_dict.keys(). Jeśli próbowałeś zrobić coś takiego:

for key in my_dict:
    my_dict[key+"-1"] = my_dict[key]-1

Spowoduje to powstanie błędu runtime, ponieważ zmieniasz klucze podczas działania programu. Jeśli jesteś absolutnie nastawiony na skrócenie czasu, skorzystaj ze sposobu for key in my_dict, ale zostałeś ostrzeżony;).

 5
Author: Neil Chowdhury o_O,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-31 18:39:18

Jeśli szukasz jasnego i wizualnego przykładu:

cat  = {'name': 'Snowy', 'color': 'White' ,'age': 14}
for key , value in cat.items():
   print(key, ': ', value)

Wynik:

name:  Snowy
color:  White
age:  14
 2
Author: Pim verleg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-13 05:08:26

Tutaj key jest tylko Nazwa zmiennej.

Key nie jest specjalnym słowem kluczowym w Pythonie.

Jak wiemy, w słownik Pythona jest zbiorem par key: value, z wymogiem, że klucze są unikalne (w ramach jednego słownika). Para szelek tworzy empty dictionary: {}. Umieszczenie oddzielonej przecinkami listy key:value par wewnątrz szelek dodaje początkowe key:value par do słownika .

Jest to najprostszy sposób na iterację przez słownik w Pythonie. Wystarczy umieścić go bezpośrednio w dla pętli, i gotowe!

d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
  print (key)

Wyjście to:-

x # Here x is key name
y # Here y is key name
z # Here z is key name

Jeśli użyjemy tego podejścia wraz z małą sztuczką, możemy przetworzyć klucze i wartości dowolnego słownika . Sztuczka polega na użyciu indexing operator [] ze słownikiem i jego kluczami , aby uzyskać dostęp do wartości :

d = {'x': 1, 'y': 2, 'z': 3} # Dictionary
for key in d:
  print (key, 'corresponds to', d[key]) # Keys (key) and the values (d[key])
                                        # of d at the same time

Wyjście jest następujące:

x corresponds to 1 # Here 'x' is key and 1 is value
y corresponds to 2 # Here 'y' is key and 2 is value
z corresponds to 3 # Here 'z' is key and 3 is value

Poprzedni kod pozwala na uzyskanie dostępu do kluczy (key) i wartości (d[key]) z d (d jest nazwą słownika) w tym samym czasie. W ten sposób możemy wykonać dowolną operację zarówno z kluczami , jak i z wartościami .

Możemy również iteratr nad słownikiem używając pętli dla w ten sposób:

for key_name, _value in d.items():
  print(key_name, ":", _value)
  # key_name and _value are variable names.

Wyjście następującej treści to:

x : 1
y : 2
z : 3

Mam nadzieję, że pomoże to zrozumieć key:value parę w słownik Pythona a także iteracja .

 0
Author: Raksha Saini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-13 05:13:50