Python 3中如何处理列表内重复day键的字典数据?
字典列表按
day字段去重并保留最后出现项 需求说明
给定存储调度数据的字典列表,当列表中存在day字段重复的字典时,保留最后出现的那一项,删除之前的重复项。比如示例中的Saturday出现两次,最终保留第二个(full_day: False、close_day: True)的条目。
示例数据
data = [ {'day': 'Monday', 'full_day': True, 'close_day': False, 'start_time': None, 'close_time': None}, {'day': 'Tuesday', 'full_day': True, 'close_day': False, 'start_time': None, 'close_time': None}, {'day': 'Wednesday', 'full_day': True, 'close_day': False, 'start_time': None, 'close_time': None}, {'day': 'Thursday', 'full_day': True, 'close_day': False, 'start_time': None, 'close_time': None}, {'day': 'Friday', 'full_day': True, 'close_day': False, 'start_time': None, 'close_time': None}, {'day': 'Saturday', 'full_day': True, 'close_day': False, 'start_time': None, 'close_time': None}, {'day': 'Saturday', 'full_day': False, 'close_day': True, 'start_time': None, 'close_time': None}, {'day': 'Sunday', 'full_day': True, 'close_day': False, 'start_time': None, 'close_time': None} ]
解决方案
方法1:利用Python 3.7+字典的有序性
Python 3.7及以上版本的标准字典会保留键的插入顺序,我们可以遍历列表,用day作为字典的键,对应的完整字典作为值——后续出现的同day条目会自动覆盖之前的,最后将字典的值转为列表即可得到结果:
# 遍历列表,用day作为键存储,后续重复项自动覆盖前序 unique_data = {item['day']: item for item in data} # 转换回列表,保持最后出现项的顺序 result = list(unique_data.values())
方法2:兼容Python 3.6及以下版本
如果使用Python 3.6或更早版本,标准字典不保证有序,可以使用collections.OrderedDict实现同样逻辑:
from collections import OrderedDict unique_data = OrderedDict() for item in data: # 每次遇到同day的条目,覆盖之前的存储 unique_data[item['day']] = item result = list(unique_data.values())
验证结果
执行后,result中的Saturday条目会是列表中最后出现的那一项:
{'day': 'Saturday', 'full_day': False, 'close_day': True, 'start_time': None, 'close_time': None}
这种方法的时间复杂度为O(n),处理效率高,适合大多数场景。
内容的提问来源于stack exchange,提问作者Ahmed Yasin
相关产品推荐
相关产品推荐

