我有一个字典列表,其结构类似于以下示例:
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
有更好的方法吗?
key=itemgetter('user_id', 'action')
可以在不需要lambda的情况下完成相同的工作。 - Padraic Cunningham