'For' d├Âng├╝s├╝n├╝ kullanarak s├Âzl├╝kler ├╝zerinde yineleme


Al─▒nan cevaba git


A┼ča─č─▒daki kod taraf─▒ndan biraz ┼ča┼č─▒rd─▒m:

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

Anlamad─▒─č─▒m key k─▒s─▒m k─▒sm─▒. Python anahtar─▒ yaln─▒zca s├Âzl├╝kten okumas─▒ gerekti─čini nas─▒l anlar? M─▒ key Python ├Âzel bir kelime? Yoksa bu sadece bir de─či┼čken mi?


2855









Cevap say─▒s─▒n─▒ say: 10






key sadece de─či┼čken bir add─▒r.

 for key in d:
 

sadece anahtarlar ve de─čerler yerine s├Âzl├╝kteki tu┼člar─▒n ├╝zerinden ge├žecektir. Hem anahtar─▒n hem de de─čerin ├╝zerinde dola┼čmak 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 key olarak de─či┼čtirin poop .

Python 3.x i├žin, dict taraf─▒ndan desteklenen set benzeri bir g├Âr├╝n├╝m d├Ând├╝ren iteritems() basit ama ayn─▒ ┼čekilde daha iyi bir ┼čekilde de─či┼čtirildi. Bu 2.7 olarak da mevcuttur . items() iteritems() viewitems()

─░┼člem items() , hem 2 hem de 3 i├žin ├žal─▒┼čacak, ancak 2'de (key, value) , items() aramadan sonra ger├žekle┼čen dikte de─či┼čikliklerini yans─▒tmayacak olan s├Âzl├╝k ├žiftlerinin bir listesini d├Ând├╝recektir . 3.x de 2.x davran─▒┼č─▒n─▒ istiyorsan─▒z, ├ža─č─▒rabilirsiniz list(d.items()) .


5019







Bu anahtar ├Âzel bir kelime de─čildir, ancak s├Âzl├╝kler yineleyici protokol├╝n├╝ uygular. Bunu s─▒n─▒f─▒n─▒zda yapabilirsiniz, ├Ârne─čin s─▒n─▒f yineleyicilerinin nas─▒l olu┼čturulaca─č─▒yla ilgili olarak bu soruya bak─▒n .

S├Âzl├╝kler durumunda, C d├╝zeyinde uygulan─▒r. Detaylar PEP 234'te mevcuttur . ├ľzellikle, "S├Âzl├╝k Yineleyicileri" ba┼čl─▒kl─▒ b├Âl├╝m:

  • S├Âzl├╝kler, s├Âzl├╝k tu┼člar─▒ ├╝zerinde yinelenen verimli bir yineleyici d├Ând├╝ren bir tp_iter yuvas─▒ uygular. [...] Bu yazabilece─čimiz anlam─▒na gelir

     for k in dict: ...
     

    e┼čde─čer, ancak ├žok daha h─▒zl─▒

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

    S├Âzl├╝─če yap─▒lan de─či┼čiklikler ├╝zerindeki k─▒s─▒tlamalar (d├Âng├╝ ya da ba┼čka bir i┼č par├žac─▒─č─▒ taraf─▒ndan) ihlal edilmedi─či s├╝rece.

  • Farkl─▒ t├╝rlerde yinelemeleri a├ž─▒k├ža d├Ând├╝ren s├Âzl├╝klere y├Ântemler ekleyin:

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

    Bunun for x in dict i├žin steno oldu─ču anlam─▒na gelir for x in dict.iterkeys() .

Python 3, dict.iterkeys() , dict.itervalues() ve dict.iteritems() art─▒k desteklenmektedir. Kullan─▒m dict.keys() , dict.values() ve dict.items() bunun yerine.


401


2010-07-20





dict Burada g├Ârebilece─činiz gibi, bir s─▒rayla tu┼člar─▒ ├╝zerinden yinelenen yineleme :

D├╝zenleme: (Bu art─▒k Python3.6'da ge├žerli de─čil , ancak bunun hen├╝z garantili bir davran─▒┼č olmad─▒─č─▒n─▒ unutmay─▒n )

 >>> 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 tuples listesi verir. ├ťzerlerinde bu ┼čekilde d├Âng├╝ olu┼čturdu─čunuzda, her bir demet a├ž─▒l─▒r k ve v otomatik olarak a├ž─▒l─▒r :

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

D├Âng├╝n├╝n g├Âvdesi sadece birka├ž sat─▒r ise, a ├╝zerinden d├Âng├╝ yaparken k ve v de─či┼čken isimleri olarak kullanmak dict olduk├ža yayg─▒nd─▒r. Daha karma┼č─▒k d├Âng├╝ler i├žin, daha a├ž─▒klay─▒c─▒ adlar kullanmak iyi bir fikir olabilir:

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

Bi├žimlendirme dizgilerini kullanma al─▒┼čkanl─▒─č─▒n─▒ edinmek iyi bir fikirdir:

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

189







key sadece bir de─či┼čkendir.

─░├ž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)
 

73







for .. in .. -Syntax'─▒ kullanarak s├Âzl├╝kleri yineledi─činizde, her zaman tu┼člar─▒n ├╝zerinden yinelenir (de─čerler kullan─▒larak eri┼čilebilir dictionary[key] ).

Anahtar-de─čer ├žiftleri ├╝zerinde yineleme yapmak i├žin, Python 2 kullan─▒m─▒nda for k,v in s.iteritems() ve Python 3'te for k,v in s.items() .


52







Bu ├žok yayg─▒n bir d├Âng├╝ deyimidir. in bir operat├Âr. ─░├žin ne zaman kullan─▒laca─č─▒n─▒ for key in dict ve gerekti─činde for key in dict.keys() bkz David Goodger en Deyimsel Python makalesine (ar┼čivlenmi┼č kopyas─▒) .


27







Anahtar, de─čer ├žifti ve ayn─▒ zamanda nerede oldu─čumu g├Âsteren endeksi almak i├žin dikte boyunca yinelemem gereken bir kullan─▒m durumum var. Bu nas─▒l yapar─▒m:

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

Anahtar─▒n parantez i├žindeki de─čerin ├Ânemli oldu─čunu, parantez olmadan, bir ValueError "paketini a├žmak i├žin yeterli de─čer" olmad─▒─č─▒n─▒ unutmay─▒n.


14







'For' d├Âng├╝s├╝n├╝ kullanarak s├Âzl├╝kler ├╝zerinde yineleme

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

Python anahtar─▒ yaln─▒zca s├Âzl├╝kten okumas─▒ gerekti─čini nas─▒l anlar? Python'da anahtar ├Âzel bir kelime midir? Yoksa bu sadece bir de─či┼čken mi?

Bu sadece for d├Âng├╝ler de─čil . Buradaki ├Ânemli kelime "yineleme" dir.

S├Âzl├╝k, anahtarlar─▒n de─čerlere e┼členmesidir:

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

Ne zaman yinelersek, anahtarlar─▒n ├╝zerinden ge├žiyoruz. De─či┼čken ismi key sadece tan─▒mlay─▒c─▒ olmas─▒ ama├žlanm─▒┼čt─▒r - ve ama├ž i├žin olduk├ža uygundur.

Bu bir liste anlamada ger├žekle┼čir:

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

S├Âzl├╝─če listeyi (veya ba┼čka bir koleksiyon t├╝r├╝ nesnesi) ge├žti─čimizde ortaya ├ž─▒kar:

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

Python yineleme y├Ântemi, ihtiya├ž duydu─ču bir ba─člamda, __iter__ bir yineleyici (bu durumda bir keyiterator nesnesi) d├Ând├╝ren nesnenin y├Ântemini (bu durumda s├Âzl├╝k) ├ža─č─▒r─▒r:

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

Bu ├Âzel y├Ântemleri kendimiz kullanmamal─▒y─▒z, bunun yerine ilgili yerle┼čik i┼člevi kullan─▒n iter :

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

Yineleyicilerinin bir __next__ y├Ântemi vard─▒r - ancak bunu yerle┼čik i┼člevi ile ├ža─č─▒r─▒r─▒z 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├╝kseltir StopIteration . Python'un bir for d├Âng├╝den, liste kavray─▒┼č─▒ndan veya bir ├╝retici ifadesinden veya herhangi bir yinelemeli i├žerikten ├ž─▒kmay─▒ nas─▒l bildi─či budur . Bir yineleyici y├╝kseltti─činde StopIteration her zaman y├╝kseltecektir - tekrar yinelemek istiyorsan─▒z, yenisine ihtiyac─▒n─▒z var.

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

Diyetlere d├Ânmek

Pek ├žok ba─člamda yinelenen dikmeler g├Ârd├╝k. G├Ârd├╝─č├╝m├╝z ┼čey, herhangi bir zorunlulukta yineleme yapt─▒─č─▒m─▒zda, anahtarlar─▒ almam─▒z. Orijinal ├Ârne─če d├Ân:

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

De─či┼čken ad─▒n─▒ de─či┼čtirirsek, yine de anahtarlar─▒ al─▒r─▒z. Hadi deneyelim:

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

De─čerler ├╝zerinde yineleme yapmak istiyorsak .values , dicts y├Ântemini kullanmal─▒y─▒z , veya her ikisi i├žin de .items :

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

Verilen ├Ârnekte, bu gibi ├Â─čelerin ├╝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 gayet iyi.


12







Git CPub'in CPython uygulamas─▒n─▒ kontrol edebilirsiniz dicttype . Bu, yineleyici yineleyiciyi uygulayan y├Ântemin imzas─▒d─▒r:

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

CPython dictobject.c


7







Anahtarlar─▒ yinelemek i├žin, daha yava┼č ama kullan─▒m─▒ 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─činiz i├žin bir ├žal─▒┼čma zaman─▒ hatas─▒ olu┼čturur. S├╝reyi kesinlikle azaltmaya ayarland─▒ysan─▒z, for key in my_dict yolu kullan─▒n , ancak uyard─▒n─▒z;).


2



─░lgili yay─▒nlar


Bir s├Âzl├╝kte yineleme yapman─▒n en iyi yolu nedir?

Java'da bir enum ├╝zerinden yinelenecek bir 'for' d├Âng├╝s├╝

Bir s├Âzl├╝kte yinelenen ├Â─čeler nas─▒l silinir?

Python'da s─▒ral─▒ anahtar s─▒ras─▒na g├Âre bir s├Âzl├╝─č├╝ nas─▒l yineleyebilirim?

S├Âzl├╝k ├╝zerinde yineleme yapman─▒n bir yolu var m─▒?

Python'da Listeye Gelen S├Âzl├╝k Anahtar De─čerlerini Tekrarlama

Handlebars.js kullanarak temel ÔÇťforÔÇŁ d├Âng├╝s├╝n├╝ yineleme

addEventListener d├Âng├╝ i├žin ve de─čerleri ge├žerken [yinelenen]

Her d├Âng├╝ i├žin bir C# hangi s─▒rayla bir Liste <T> ├╝zerinde yinelenir?

2B dizi ├╝zerinde yineleme yapmak i├žin i├ž i├že d├Âng├╝lerin hangi s─▒ralamas─▒ daha verimlidir [kopya]

Etiketle ilgili di─čer sorular [python]


─░┼člemden ├Ânce 'git add' i┼člemini nas─▒l geri alabilirim?

C++ 11 standart bir bellek modeli tan─▒tt─▒. Bunun anlam─▒ ne? Ve C++ programlamay─▒ nas─▒l etkileyecek?

'Senkronize' ne demektir?

Telefon numaralar─▒n─▒ nas─▒l i┼čaretlerim?

System.currentTimeMillis vs System.nanoTime

Flexbox i├žindeki metni dikey olarak nas─▒l hizalars─▒n─▒z?

Swift Dizisini Nas─▒l Dizeye D├Ân├╝┼čt├╝r├╝r├╝m?

XPath kullanarak ├Âzellik alma

Modern C++ 11 / C++ 14 / C++ 17 ve gelecekteki C++ 20 dizelerinde

├ľzellik dal─▒n─▒ ba┼čka bir ├Âzellik dal─▒na yeniden olu┼čturun