如何为嵌套字典通讯录的条目添加连续序号并打印?
解决enumerate遍历字典items时的ValueError问题
你遇到的ValueError: not enough values to unpack (expected 3, got 2)错误,根源是对enumerate()的返回值理解有误。
当你使用enumerate(addressBook.items())时,它返回的每一个元素是一个包含两个元素的元组:(索引, (key, value))——也就是把addressBook.items()返回的每个(key, value)元组,再和索引打包成了新的元组。而你试图直接把这个元组拆成index, key, value三个变量,自然会因为元素数量不匹配报错。
正确的写法有两种:
方法1:显式拆分嵌套元组
把key和value用括号包裹,告诉Python这是嵌套的元组:
addressBook = {'Jim': {'name': 'James Marsh', 'address': '32 Morris Ave', 'phone': '6549873217'}, 'Leanne': {'name': 'Leanne Moss', 'address': '37 Shamrock Lane', 'phone': '1234567890'}, 'Chris': {'name': 'Christopher Philips', 'address': '49 Langley Court', 'phone': '3216549870'}} for index, (key, value) in enumerate(addressBook.items(), start=1): print(f"{index}\t{key}") print(value['name']) print(value['address']) # 可选:给电话号码添加短横线格式 phone = value['phone'] formatted_phone = f"{phone[:3]}-{phone[3:6]}-{phone[6:]}" print(formatted_phone + '\n')
方法2:先获取索引和item,再拆分item
如果觉得嵌套括号容易混淆,也可以先拿到索引和完整的item,再拆分key和value:
addressBook = {'Jim': {'name': 'James Marsh', 'address': '32 Morris Ave', 'phone': '6549873217'}, 'Leanne': {'name': 'Leanne Moss', 'address': '37 Shamrock Lane', 'phone': '1234567890'}, 'Chris': {'name': 'Christopher Philips', 'address': '49 Langley Court', 'phone': '3216549870'}} for index, item in enumerate(addressBook.items(), start=1): key, value = item print(f"{index}\t{key}") print(value['name']) print(value['address']) formatted_phone = f"{value['phone'][:3]}-{value['phone'][3:6]}-{value['phone'][6:]}" print(formatted_phone + '\n')
额外优化点:
- 使用
enumerate()的start参数直接从1开始计数,不用再手动index+1,更简洁。 - 用f-string格式化输出,比字符串拼接更易读。
- 可以自动给电话号码添加短横线,让输出和示例完全一致。
运行上面的代码,就能得到你想要的带连续序号的通讯录输出啦!
内容的提问来源于stack exchange,提问作者Jim421616
相关产品推荐
相关产品推荐

