ทำไมคุณต้องเรียกitems()
ให้ทำซ้ำคีย์คู่ค่าในพจนานุกรม? กล่าวคือ
dic = {'one': '1', 'two': '2'}
for k, v in dic.items():
print(k, v)
เหตุใดจึงไม่เป็นพฤติกรรมเริ่มต้นของการทำซ้ำในพจนานุกรม
for k, v in dic:
print(k, v)
ทำไมคุณต้องเรียกitems()
ให้ทำซ้ำคีย์คู่ค่าในพจนานุกรม? กล่าวคือ
dic = {'one': '1', 'two': '2'}
for k, v in dic.items():
print(k, v)
เหตุใดจึงไม่เป็นพฤติกรรมเริ่มต้นของการทำซ้ำในพจนานุกรม
for k, v in dic:
print(k, v)
คำตอบ:
สำหรับทุกหลามคอนเทนเนอร์ 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
กลับมาเป็นอีกครั้ง)
ฉันเดา:ใช้ 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__
) แต่ความไม่ลงรอยกันเพียงเล็กน้อยนั้นจะค่อนข้างสับสนและไม่สอดคล้องกัน
x in foo
เฉพาะในกรณีที่i
ในfor i in foo
ถือว่าค่าของx
ในบางจุดที่ผมจะบอกว่ามันจะเป็นมากขนาดใหญ่ที่ไม่สอดคล้องกัน