You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为嵌套字典通讯录的条目添加连续序号并打印?

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:21:08