Python 2.7列表转字典时丢失一组键值对,原因是什么?
问题分析与解决方案
嘿,我帮你揪出问题所在了!你遇到的键值对丢失,核心原因是字典的键具有唯一性——你的源列表里有重复的键'Social security and child support:',当你直接用dict(zip(k, v))转换时,后面的键值对会直接覆盖前面的同名键,导致第一组邮箱的键值对被丢失。
先拆解下你的源数据:
- 你提取的键列表
k是:['Social security and child support:', 'Enquiries:', 'Social security and child support:', 'Social security and child support fax:'] - 对应的值列表
v是:['sscsa-glasgow@justice.gov.uk', 'enquiries-cicap@hmcts.gsi.gov.uk', '0300 790 6234', '01264 347 981']
这里第二个'Social security and child support:'会覆盖第一个,所以最终字典里这个键只会保留最后对应的电话值,邮箱那组就没了。另外提一句:你原代码里的for i in le_list循环完全是多余的——每次循环都重复生成k和v,根本没用到循环变量i,直接一次处理就行。
解决方案
根据你的需求,分两种情况处理:
1. 保留所有同名键的对应值(推荐)
如果想把同一个键的多个值都存起来,可以用collections.defaultdict来生成值为列表的字典:
from collections import defaultdict le_list = ['Social security and child support:', 'sscsa-glasgow@justice.gov.uk', 'Enquiries:', 'enquiries-cicap@hmcts.gsi.gov.uk', 'Social security and child support:', '0300 790 6234', 'Social security and child support fax:', '01264 347 981'] # 初始化一个值为列表的字典 le_dict = defaultdict(list) # 成对遍历键和值,逐个添加 for key, value in zip(le_list[0::2], le_list[1::2]): le_dict[key].append(value) # 可选:转成普通字典格式 le_dict = dict(le_dict) print(le_dict)
输出结果会保留所有数据:
{ 'Social security and child support:': ['sscsa-glasgow@justice.gov.uk', '0300 790 6234'], 'Enquiries:': ['enquiries-cicap@hmcts.gsi.gov.uk'], 'Social security and child support fax:': ['01264 347 981'] }
2. 给重复键重命名(如果需要单个值对应单个键)
如果你希望每个键都是唯一的,可以手动给重复键加后缀(比如序号),示例代码:
le_list = ['Social security and child support:', 'sscsa-glasgow@justice.gov.uk', 'Enquiries:', 'enquiries-cicap@hmcts.gsi.gov.uk', 'Social security and child support:', '0300 790 6234', 'Social security and child support fax:', '01264 347 981'] le_dict = {} key_count = {} for key, value in zip(le_list[0::2], le_list[1::2]): if key in key_count: key_count[key] += 1 # 给重复键加序号后缀 new_key = f"{key} ({key_count[key]})" le_dict[new_key] = value else: key_count[key] = 1 le_dict[key] = value print(le_dict)
输出结果会把重复键区分开:
{ 'Social security and child support:': 'sscsa-glasgow@justice.gov.uk', 'Enquiries:': 'enquiries-cicap@hmcts.gsi.gov.uk', 'Social security and child support: (2)': '0300 790 6234', 'Social security and child support fax:': '01264 347 981' }
内容的提问来源于stack exchange,提问作者ron_g
相关产品推荐
相关产品推荐

