gpt4 book ai didi

python - 在 Python 中过滤字典列表的更好方法

转载 作者:太空宇宙 更新时间:2023-11-03 12:27:29 25 4
gpt4 key购买 nike

我有一个结构类似于这个的字典列表:

log = [{'user_id': 'id1', 'action': 'action1', 'timestamp': 'time1'},  
{'user_id': 'id2', 'action': 'action2', 'timestamp': 'time2'},
...]

并按时间戳值排序。

我想删除同一用户完成的连续相同操作,只留下第一个,例如如果我有以下列表:

log = [{'user_id': 'id1', 'action': 'action1', 'timestamp': 'time1'},
{'user_id': 'id1', 'action': 'action1', 'timestamp': 'time2'},
{'user_id': 'id1', 'action': 'action1', 'timestamp': 'time3'},
{'user_id': 'id2', 'action': 'action2', 'timestamp': 'time4'},
{'user_id': 'id3', 'action': 'action2', 'timestamp': 'time5'},
{'user_id': 'id3', 'action': 'action2', 'timestamp': 'time6'},
{'user_id': 'id1', 'action': 'action1', 'timestamp': 'time7'},
{'user_id': 'id1', 'action': 'action1', 'timestamp': 'time8'}]

我想得到这个列表作为结果:

log = [{'user_id': 'id1', 'action': 'action1', 'timestamp': 'time1'},
{'user_id': 'id2', 'action': 'action2', 'timestamp': 'time4'},
{'user_id': 'id3', 'action': 'action2', 'timestamp': 'time5'},
{'user_id': 'id1', 'action': 'action1', 'timestamp': 'time7'}]

目前我是这样做的:

def merge_actions(log):
merged_log = []
merged_log.append(log[0])
for i in range(1, len(log)):
if log[i]['user_id'] == log[i-1]['user_id']:
if log[i]['action'] == log[i-1]['action']:
continue
merged_log.append(log[i])
return merged_log

有更好的方法吗?

最佳答案

如果您使用 itertools.groupby并按 'user_id''action' 分组,您可以从每个组中获取第一个元素。

>>> [next(group) for key, group in itertools.groupby(log, key = lambda i: (i['user_id'], i['action']))]
[{'timestamp': 'time1', 'action': 'action1', 'user_id': 'id1'},
{'timestamp': 'time4', 'action': 'action2', 'user_id': 'id2'},
{'timestamp': 'time5', 'action': 'action2', 'user_id': 'id3'},
{'timestamp': 'time7', 'action': 'action1', 'user_id': 'id1'}]

关于python - 在 Python 中过滤字典列表的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30709717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com