Python'da bir sözlük üzerinde yineleme yaparken neden .items () 'i çağırmanız gerekiyor?


131

items()Bir sözlükteki anahtar, değer çiftlerini yinelemek için neden aramanız gerekiyor? yani.

dic = {'one': '1', 'two': '2'}
for k, v in dic.items():
    print(k, v)

Neden bir sözlük üzerinde yinelemenin varsayılan davranışı bu değil

for k, v in dic:
    print(k, v)

Yanıtlar:


171

Her python konteyneri C için beklenti şudur:

for item in C:
    assert item in C

gayet iyi geçecek - bir duygunun olması şaşırtıcı değil mi?in (döngü maddesinde) diğer (varlığı kontrol) den tamamen farklı bir anlamı vardı? Elbette isterim! Doğal olarak listeler, setler, tuplelar vb. İçin bu şekilde çalışır.

Öyleyse, Csözlük olduğunda , bir döngüde inanahtar / değer demetleri verecek olsaydı for, o zaman, en az şaşkınlık ilkesine göre in, kapsama kontrolünde sol taraftaki işleneni olarak böyle bir demeti de almak zorunda kalırdı.

Bu ne kadar yararlı olur? Oldukça yararsız gerçekten, temelde yapım if (key, value) in Ciçin eşanlamlısını if C.get(key) == valueBen gerçekleştirilen veya gerçekleştirmek istediği bulunduğuna inanıyoruz çek olan 100 kat daha nadiren olandan - if k in Caslında araçlar anahtarın varlığını kontrol sadece ve tamamen değerini görmezden.

Öte yandan, sadece tuşlar üzerinde döngü yapmak istemek oldukça yaygındır, örneğin:

for k in thedict:
    thedict[k] += 1

değere sahip olmak özellikle yardımcı olmaz:

for k, v in thedict.items():
    thedict[k] = v + 1

aslında biraz daha az açık ve daha az özlü. ( itemsAnahtar / değer çiftlerini elde etmek için kullanılacak "uygun" yöntemlerin orijinal yazılışı olduğunu unutmayın : ne yazık ki bu, bu tür erişimcilerin tam listeleri döndürdüğü günlerdeydi, bu nedenle "yalnızca yinelemeyi" desteklemek için alternatif bir yazımın tanıtılması gerekiyordu ve iteritems öyleydi - önceki Python sürümleriyle geriye dönük uyumluluk kısıtlamalarının çok zayıfladığı Python 3'te, itemsyeniden oldu ).


10

Tahminim: Tam demeti kullanmak döngü için daha sezgisel olurdu, ancak üyelik kullanımı için test etmek için belki daha az in.

if key in counts:
    counts[key] += 1
else:
    counts[key] = 1

Hem anahtarı hem de değeri belirtmeniz gerekse bu kod gerçekten işe yaramazdı in. Hem anahtar hem de değerin sözlükte olup olmadığını kontrol edeceğiniz kullanım durumunu hayal etmekte zorlanıyorum. Yalnızca anahtarları test etmek çok daha doğaldır.

# When would you ever write a condition like this?
if (key, value) in dict:

Artık inoperatörün ve for ... inaynı öğeler üzerinde çalışması gerekli değildir . Uygulama açısından farklı işlemlerdir ( __contains__vs. __iter__). Ancak bu küçük tutarsızlık biraz kafa karıştırıcı ve tutarsız olacaktır.


İçin olduğu göz önüne alındığında , her ben, düşün ki iterable yerleşik başka tip x in fooyalnızca iiçinde for i in foodeğerini varsayar xbir noktada, ben çok olacağını söyleyebilirim büyük tutarsızlık.
aaronasterling
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.