将同键字典列表合并为单列表时遇AttributeError问题排查
嘿,我来帮你拆解这个问题!
错误原因分析
你遇到的 AttributeError: 'str' object has no attribute 'iterkeys' 本质是两个问题叠加:
- 版本语法差异:
iterkeys()是 Python 2 中字典的专属方法,Python 3 已经把它替换成了keys()(或者直接用items()遍历键值对); - 类型不匹配:最关键的是——你代码中调用
iterkeys()的对象根本不是字典,而是字符串!这说明你的字典列表里可能混进了非字典元素(比如某个位置是纯字符串),或者你在遍历过程中误把字典的字符串值当成字典来操作了。
针对你的场景的解决方案
既然你说所有字典的键都相同,且值是字符串类型,我分两种常见需求给你对应代码:
需求1:提取某个特定键的所有字符串值,合并成一个列表
比如你想把所有字典里的 name 字段值合并:
# 示例输入(确保列表里都是字典,若有混进字符串可加判断) dict_list = [ {"name": "Alice", "city": "NYC"}, {"name": "Bob", "city": "London"}, {"name": "Charlie", "city": "Tokyo"} ] # 提取name字段,同时过滤非字典元素避免报错 result = [d["name"] for d in dict_list if isinstance(d, dict)] print(result) # 输出: ['Alice', 'Bob', 'Charlie']
需求2:把所有相同键对应的字符串值,合并成一个键为列表的字典
比如把每个键对应的所有字符串值收集到列表里:
from collections import defaultdict dict_list = [ {"name": "Alice", "city": "NYC"}, {"name": "Bob", "city": "London"}, {"name": "Charlie", "city": "Tokyo"} ] merged = defaultdict(list) for item in dict_list: # 先判断当前元素是不是字典,避免字符串触发错误 if not isinstance(item, dict): continue # Python 3用items()遍历键值对,替代Python 2的iteritems() for key, value in item.items(): merged[key].append(value) # 转换成普通字典(可选) merged_dict = dict(merged) print(merged_dict) # 输出: {'name': ['Alice', 'Bob', 'Charlie'], 'city': ['NYC', 'London', 'Tokyo']}
为什么你的问题不是重复提问?
你提到之前的类似问题都是处理数值类型,但其实核心差异不在值的类型,而在于你触发了字符串 vs 字典的类型错误——上面的代码特意加入了 isinstance(item, dict) 的判断,既能避免非字典元素导致的报错,也能完美兼容字符串类型的值。
内容的提问来源于stack exchange,提问作者Raghav Patnecha
相关产品推荐
相关产品推荐

