เรียนรู้ Python วิธีที่ยาก - แบบฝึกหัดที่ 39

ในแบบฝึกหัดที่ 39 ของ Learn Python The Hard Way บรรทัดที่ 37 ถึง 39 มีลักษณะดังนี้:

print "-"*10
for state, abbrev in states.items():
    print "%s has the city %s" % (state, abbrev)

ฉันคิดว่าฉันเข้าใจสิ่งนี้ ฉันคิดว่า Python รับ KEY:VALUE จาก "states" และกำหนด KEY ให้กับ "state" และ VALUE เป็น "abbrev"

อย่างไรก็ตาม ฉันพบว่ามีสิ่งแปลก ๆ เกิดขึ้นเมื่อฉันป้อนรหัสต่อไปนี้:

print "-"*10
for test in states.items():
    print "%s has the city %s" % (test)

มันสร้างผลลัพธ์เดียวกันกับรหัสต้นฉบับ แต่จะใช้งานได้ก็ต่อเมื่อคุณใส่ %s ลงในคำสั่ง print สองครั้ง

ใครสามารถอธิบายสิ่งที่เกิดขึ้นกับ "การทดสอบ" ได้บ้าง "การทดสอบ" คืออะไรกันแน่? ทูเพิลหรือเปล่า? ดูเหมือนว่าจะมีทั้ง KEY และ VALUE จาก states.items()

ฉันได้ดูคำถามอื่นๆ ในแบบฝึกหัดที่ 39 ที่นี่แล้ว และไม่พบคำถามเดียวกัน

รหัสแสดงอยู่ด้านล่าง (สำหรับ Python 2.7)

# create a mapping of state to abbreviation

states = {
    'Oregan': 'OR',
    'Florida': 'FL',
    'California': 'CA',
    'New York' : 'NY',
    'Michigan' : 'MI'
    }

print "-"*10
for state, abbrev in states.items():
    print "%s has the city %s" % (state, abbrev)

print "-"*10
for test in states.items():
    print "%s has the city %s" % (test)

person alfo35x    schedule 13.03.2016    source แหล่งที่มา
comment
คุณไม่จำเป็นต้องใช้ state.items() การทำซ้ำเริ่มต้นของพจนานุกรมคือกุญแจสำคัญ   -  person sameera sy    schedule 13.03.2016


คำตอบ (2)


states เป็นพจนานุกรม ดังนั้นเมื่อคุณเรียก for test in states.items() มันจะกำหนดแต่ละรายการในพจนานุกรม (a tuple) ให้กับ test

จากนั้นคุณเพียงแค่วนซ้ำรายการและพิมพ์คีย์และค่าของรายการเหล่านั้นตามที่คุณต้องการด้วย for state, abbrev in states.items():

>>> for state in states.items():
    print (state) # print all the tuples


('California', 'CA')
('Oregan', 'OR')
('Florida', 'FL')
('Michigan', 'MI')
('New York', 'NY')

รายละเอียดทั้งหมดสามารถดูได้ทางออนไลน์ เช่น ใน PEP 234 -- Iterators ภายใต้ ตัววนซ้ำพจนานุกรม:

  • #P4#
    for k in dict: ... 
    
    #P5#
    for k in dict.keys(): ... 
    
    #P6#
  • #P7#
    for key in dict.iterkeys(): ...
    
    for value in dict.itervalues(): ...
    
    for key, value in dict.iteritems(): ...
    
    #P8#
person Idos    schedule 13.03.2016
comment
ดังนั้นถ้าฉันเข้าใจ การทดสอบจะเทียบเท่ากับ for k ใน dict และเมื่อคุณวนซ้ำด้วยคำสั่ง print คุณจะต้องมี %s สองอินสแตนซ์ เนื่องจาก test มีทั้งคีย์และค่า - person alfo35x; 13.03.2016
comment
ใช่ ตัวแก้ไข %s เป็นสตริงเดี่ยว ดังนั้นจึงคาดว่าจะมี 2 ตัวในนั้นเนื่องจากคุณพยายามพิมพ์รายการพจนานุกรมที่มีคีย์และค่า :) - person Idos; 13.03.2016
comment
เยี่ยมมาก ขอบคุณมาก ตอนแรกฉันลองทำแบบทดสอบนั้นเพื่อเป็นวิธีทดสอบ และจากนั้นก็ประหลาดใจเมื่อได้ผลแบบนั้น ความช่วยเหลือดีมาก ขอบคุณทุกคน! - person alfo35x; 14.03.2016

"ลิงก์ที่ขาดหายไป" ระหว่างข้อมูลโค้ดตัวแรกและตัวที่สองของคุณอธิบายว่าเหตุใดจึงเทียบเท่ากัน:

print "-"*10
for test in states.items():
    state, abbrev = test
    print "%s has the city %s" % (state, abbrev)
person VPfB    schedule 13.03.2016