Python按Key向列表追加元素异常问题排查
问题:字典中所有列表共享同一引用导致数据错误?
我有一个包含创建日期的数据集,将日期转换为月份后,生成以月份数字为键、空列表为值的字典:
{8: [], 7: []}
尝试按对应键向列表追加对应月份数据时,所有数据被添加到所有列表中,得到如下错误输出:
{8: [7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8], 7: [7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8]}
期望输出应为每个键的列表仅包含对应月份值:
{8: [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8], 7: [7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7]}
我的代码如下:
group_keys = [] for e in data: group_keys.append(e.get('start_date').month) group_keys = dict.fromkeys(set(group_keys), []) print(group_keys) for e in data: month = e.get('start_date').month group_keys[month].append(month) print(group_keys)
问题原因与解决方法
错误原因
你用dict.fromkeys(set(group_keys), [])创建字典时,所有键共享同一个空列表的引用。也就是说,字典里的8: []和7: []指向的是内存中同一个列表对象,所以不管你给哪个键的列表追加数据,都会修改这个共享的列表,最终所有键的列表内容完全一致。
解决方法
替换字典的创建方式,确保每个键都对应独立的空列表。最简洁的方式是使用字典推导式:
group_keys = {month: [] for month in set(group_keys)}
修正后的完整代码:
group_keys = [] for e in data: group_keys.append(e.get('start_date').month) # 用字典推导式创建每个键对应独立空列表的字典 group_keys = {month: [] for month in set(group_keys)} print(group_keys) for e in data: month = e.get('start_date').month group_keys[month].append(month) print(group_keys)
这样每个键的列表都是独立的对象,追加数据时只会修改对应键的列表,就能得到你期望的输出。
内容的提问来源于stack exchange,提问作者Nataly Firstova
相关产品推荐
相关产品推荐

