Soru 'For' döngülerini kullanarak sözlükler üzerinde yineleme


Aşağıdaki kodla biraz şaşırdım:

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

Anlamadığım şey key bölümü. Python, anahtarın sadece sözlükten okunmasının gerekli olduğunu nasıl anlar? mı key Python'da özel bir kelime? Yoksa sadece bir değişken mi?


2112
2017-07-20 22:27


Menşei




Cevaplar:


key sadece değişken bir isim.

for key in d:

sadece anahtarlar ve değerler yerine, sözlükteki anahtarların üzerine dönecektir. Hem anahtar hem de değer üzerinde döngü yapmak için aşağıdakileri kullanabilirsiniz:

Python 2.x için:

for key, value in d.iteritems():

Python 3.x için:

for key, value in d.items():

Kendiniz test etmek için kelimeyi değiştirin key için poop.

Python 3.x için iteritems() sadece yerini almıştır items()gibi bir dize tarafından desteklenen set benzeri bir görünüm döndürür iteritems() ama daha da iyi. Bu 2.7 olarak da mevcuttur viewitems().

Operasyon items() 2 ve 3 için çalışacak, ancak 2'de sözlüklerin bir listesini döndürecek (key, value) sonra oluşan dict değişiklikleri yansıtmayacak çiftleri items() aramak. 2.x davranışını 3.x'te isterseniz list(d.items()).


3804
2017-07-20 22:29



Buna benzer bir değere erişmemek için gözden kaçan bir neden eklemek: for döngüsünün içindeki d [key] tuşa tekrar basılmasını sağlar (değeri almak için). Sözlük büyük olduğunda, bu ekstra karma genel süreye eklenir. Bu Raymond Hettinger'in teknik konuşmasında tartışıldı youtube.com/watch?v=anrOzOapJ2E - Harisankar Krishna Swamy
Python 3,6 olarak değiştirildi d.items() - Decoded
İyi cevap ve gerçek deha değişmekte yatıyor key için poop. Görüş için teşekkürler, Sberry! - Mike Williamson


Bu anahtarın özel bir sözcük değil, ancak sözlükler yineleyici protokolünü uygular. Bunu sınıfınızda yapabilirsiniz, ör. görmek bu soru sınıf yineleyicileri oluşturmak için.

Sözlüklerde, C seviyesinde uygulanır. Detaylar mevcuttur PEP 234. Özellikle, "Sözlük Yineleyicileri" başlıklı bölüm:

  • Sözlükler, verimli bir şekilde döndüren bir tp_iter yuvası uyguluyor   Sözlüğün anahtarları üzerinde yineleyen yineleyici. [...] Bu   yazabileceğimiz anlamına geliyor

    for k in dict: ...
    

    buna eşdeğer, ama daha hızlı

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

    sözlükte yapılan değişiklikler kısıtlaması olduğu sürece   (döngü veya başka bir iş parçacığı tarafından) ihlal edilmez.

  • Farklı türlerde dönen sözlüklere yöntemler ekleyin   yineleyiciler açıkça:

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

    Bu şu demek for x in dict için kısa for x in dict.iterkeys().


325
2017-07-20 23:52



Python3'te dict.iterkeys (), dict.itervalues ​​() ve dict.iteritems () artık desteklenmemektedir. Bunun yerine dict.keys (), dict.values ​​() ve dict.items () kullanın. - Sadik


Bir üzerinde yineleme dict Burada görebileceğiniz gibi, belirli bir sırayla anahtarlarını değiştirir:

Düzenleme: (Bu artık içinde değil Python3.6ama dikkat edin garanti edilmez henüz davranış

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

Örneğin, kullanmak daha iyi bir fikirdir dict.items():

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

Bu size bir tupl listesi sunar. Onları böyle döndürdüğünüzde, her bir tuple k ve v otomatik olarak:

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

kullanma k ve v üzerinde döngü yaparken değişken isimler olarak dict Döngünün gövdesi sadece birkaç satır ise oldukça yaygındır. Daha karmaşık döngüler için daha açıklayıcı isimler kullanmak iyi bir fikir olabilir:

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

Biçim dizgileri kullanma alışkanlığına girmek iyi bir fikirdir:

for letter, number in d.items():
    print('{0} corresponds to {1}'.format(letter, number))

151
2017-07-21 01:27



Python 3.7 sürüm notlarından: "Dict nesnelerinin yerleştirme düzeni koruma yapısı, şimdi Python dil özelliğinin resmi bir parçasıdır." - Gregory Arenius


key sadece bir değişken.

İçin Python2.X:

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

... ya da daha iyisi,

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

İçin Python3.X:

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

44
2017-07-20 23:49





Sözlükleri kullanarak yinelediğinizde for .. in ..-syntax, her zaman anahtarların üzerinde yineler (değerler kullanılarak erişilebilir dictionary[key]).

Anahtar / değer çiftleri üzerinde yinelemek için for k,v in s.iteritems().


39
2017-07-20 22:29



Python 3 için, bu olduğunu unutmayın items() yerine iteritems() - Andreas Fester


Bu çok yaygın bir döngü deyimidir. in bir operatördür. Ne zaman kullanılır for key in dict ve ne zaman olmalı for key in dict.keys() görmek David Goodger'ın deyimsel Python makalesi.


20
2017-07-20 22:42



Bu bölümleri okurken in, operatör kısmı varlığı kontrol ettiğin yer. Belki de bunu daha iyi sil in is an operator bilgi. - Wolf


Bunu kullanabilirsiniz:

for key,val in d.items():
    print key, 'is the key for ', val

9
2018-01-14 14:42



Onun biraz eski yazı - Sadi
@Sadi Artık doğru mu? - Basj


Anahtar, değer çifti ve nerede olduğumu gösteren indeksi elde etmek için dict üzerinden yinelemem gereken bir kullanım durumum var. Ben böyle yaparım:

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

Parantez olmadan, anahtarın etrafında parantezin önemli olduğunu unutmayın, bir ValueError "paketini açmak için yeterli değerler" elde edersiniz.


6
2018-05-25 13:42





'For' döngülerini kullanarak sözlükler üzerinde yineleme

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

Python, anahtarın sadece   sözlük? Anahtar Python'da özel bir kelime mi? Yoksa sadece bir   değişken?

Sadece o değil for döngüler. Burada önemli olan kelime "yinelenen" dir.

Sözlük, değerlerin anahtarlarının bir eşlemesidir:

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

Üzerinde yinelediği her zaman, anahtarların üzerinde yineliyoruz. Değişken adı key sadece açıklayıcı amaçlıdır - ve amaç için oldukça uygundur.

Bu liste kavramasında olur:

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

Sözcüğü listeye (veya başka bir koleksiyon türü nesnesine) aktardığımız zaman olur:

>>> list(d)
['x', 'y', 'z']

Python'un yineleme şekli, ihtiyaç duyulduğu bir bağlamda, __iter__ Bir yineleyici döndüren nesnenin (bu durumda sözlük) yöntemi (bu durumda, bir keyiterator nesnesi):

>>> d.__iter__()
<dict_keyiterator object at 0x7fb1747bee08>

Bu özel yöntemleri kendimiz kullanmamalıyız, bunun yerine, onu aramak için ilgili yerleşik işlevi kullanmalıyız. iter:

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

Yineleyiciler var __next__ yöntem - ama biz yerleşik işlevle diyoruz 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

Bir yineleyici tükendiğinde, yükselir StopIteration. Python'un nasıl çıkacağını bilmesi budur. for döngü veya liste anlaşması veya bir jeneratör ifadesi veya herhangi bir yinelemeli bağlam. Bir yineleyici yükseldiğinde StopIteration her zaman yükseltecek - tekrar tekrar etmek istiyorsanız, yeni bir tane gerekir.

>>> list(key_iterator)
[]
>>> new_key_iterator = iter(d)
>>> list(new_key_iterator)
['x', 'y', 'z']

Dicts'a dönüş

Birçok bağlamda yinelenen diktikleri gördük. Gördüklerimiz, bir dict üzerinde yinelediğimiz zaman, anahtarları almamızdır. Orijinal örneğe dönün:

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

Değişken adını değiştirirsek, hala anahtarları alırız. Hadi deneyelim:

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

Değerlerin üzerinde yinelemek istiyorsak, .values Dicts yöntemi ya da her ikisi için .items:

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

Verilen örnekte, bu gibi öğeler üzerinde yineleme yapmak daha verimli olacaktır:

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

Ancak akademik amaçlar için sorunun örneği iyi.


4
2018-06-21 02:51





CPython'un uygulamasını kontrol edebilirsiniz. dicttype GitHub'da. Bu, dict yineleyiciyi uygulayan yöntemin imzasıdır:

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

CPython Instagram Hesabındaki Resim ve Videoları dictobject.c


3
2017-11-03 05:16





Anahtarların üzerinde yinelemek, daha yavaş ama kullanmak daha iyidir my_dict.keys(). Böyle bir şey yapmaya çalıştıysanız:

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

Program çalışırken anahtarları değiştirdiğinizden bir çalışma zamanı hatası oluşturur. Süreyi kısaltmaya kesinlikle ayarlanmışsanız, for key in my_dict yol, ama uyarıldınız;).


2
2017-12-31 18:39



Döngü olarak anahtar kümesini değiştiren bir döngü yazmamak "daha iyi" dir, bu nedenle, sadece kötü uygulamalarınızın çalışmasını sağlamak için anahtarların, değerlerin veya her ikisinin kopyalarını üreten işlere gerek duymazsınız. - ShadowRanger