ทำไมคุณต้องเรียก. รายการ () เมื่อทำซ้ำในพจนานุกรมใน Python


131

ทำไมคุณต้องเรียกitems()ให้ทำซ้ำคีย์คู่ค่าในพจนานุกรม? กล่าวคือ

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

เหตุใดจึงไม่เป็นพฤติกรรมเริ่มต้นของการทำซ้ำในพจนานุกรม

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

คำตอบ:


171

สำหรับทุกหลามคอนเทนเนอร์ C ความคาดหวังก็คือ

for item in C:
    assert item in C

จะผ่านไปได้ด้วยดี - คุณจะไม่รู้สึกว่ามันน่าประหลาดใจถ้าความรู้สึกเดียวin (ประโยควนซ้ำ) มีความหมายที่แตกต่างไปจากที่อื่นอย่างสิ้นเชิง (การตรวจสอบสถานะ) ฉันจะ! มันใช้งานได้อย่างเป็นธรรมชาติสำหรับรายการชุดสิ่งที่เพิ่มขึ้น ...

ดังนั้นเมื่อCใดที่พจนานุกรมถ้าinจะให้ tuples คีย์ / ค่าในforลูปดังนั้นโดยหลักการของความประหลาดใจอย่างน้อยinก็จะต้องใช้ทูเพิลเป็นตัวถูกดำเนินการทางซ้ายในการตรวจสอบการกักกัน

จะมีประโยชน์อย่างไร? if (key, value) in Cค่อนข้างไร้ประโยชน์โดยทั่วไปแล้วการสร้างคำพ้องความหมายif C.get(key) == value- ซึ่งเป็นการตรวจสอบที่ฉันเชื่อว่าฉันอาจจะทำหรือต้องการดำเนินการซึ่งน้อยกว่าif k in Cความหมายจริงถึง 100 เท่าตรวจสอบการมีอยู่ของคีย์เท่านั้นและไม่สนใจค่าโดยสิ้นเชิง

ในทางกลับกันการต้องการวนซ้ำบนปุ่มเป็นเรื่องปกติเช่น:

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

การมีคุณค่าเช่นกันจะไม่ช่วยโดยเฉพาะ:

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

จริงค่อนข้างชัดเจนและกระชับน้อยกว่า (โปรดทราบว่าitemsเป็นการสะกดแบบดั้งเดิมของเมธอด "ที่เหมาะสม" ที่จะใช้เพื่อรับคู่คีย์ / ค่า: น่าเสียดายที่ย้อนกลับไปในสมัยที่ accessors ดังกล่าวส่งคืนรายการทั้งหมดดังนั้นเพื่อสนับสนุน "เพียงแค่วนซ้ำ" จึงต้องมีการแนะนำการสะกดแบบอื่น และiteritems มันก็เป็น - ใน Python 3 ซึ่งข้อ จำกัด ด้านความเข้ากันได้ย้อนหลังกับ Python เวอร์ชันก่อนหน้านั้นอ่อนแอลงมากมันก็itemsกลับมาเป็นอีกครั้ง)


10

ฉันเดา:ใช้ tuple เต็มจะใช้งานง่ายมากขึ้นสำหรับการวนลูป inแต่บางทีอาจจะน้อยดังนั้นสำหรับการทดสอบสำหรับการเป็นสมาชิกโดยใช้

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

inรหัสที่จะไม่ทำงานจริงๆถ้าคุณมีการระบุที่สำคัญทั้งสองและความคุ้มค่า ฉันมีช่วงเวลาที่ยากลำบากในการจินตนาการถึงกรณีการใช้งานที่คุณตรวจสอบว่าทั้งคีย์และค่าอยู่ในพจนานุกรมหรือไม่ เป็นเรื่องธรรมดามากที่จะทดสอบเฉพาะปุ่ม

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

ตอนนี้ไม่จำเป็นที่inผู้ควบคุมและfor ... inดำเนินการในรายการเดียวกัน การนำไปใช้อย่างชาญฉลาดเป็นการดำเนินการที่แตกต่างกัน ( __contains__เทียบกับ__iter__) แต่ความไม่ลงรอยกันเพียงเล็กน้อยนั้นจะค่อนข้างสับสนและไม่สอดคล้องกัน


ระบุว่าสำหรับทุกชนิดอื่น ๆ ของ builtin iterable ที่ฉันสามารถคิดx in fooเฉพาะในกรณีที่iในfor i in fooถือว่าค่าของxในบางจุดที่ผมจะบอกว่ามันจะเป็นมากขนาดใหญ่ที่ไม่สอดคล้องกัน
aaronasterling
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.