【发布时间】:2022-01-21 19:05:20
【问题描述】:
我有一个 JSON 文件,它是一个字典列表。
我想根据“book_id”键删除重复的字典,并只保留其中一个具有最大值的“id”键)
示例:
book_list = [
{"id": 20, "user_id": 8, "device_id": 1, "book_id": 81},
{"id": 19, "user_id": 8, "device_id": 1, "book_id": 81},
{"id": 18, "user_id": 8, "device_id": 1, "book_id": 81},
{"id": 17, "user_id": 8, "device_id": 1, "book_id": 78},
{"id": 16, "user_id": 8, "device_id": 1, "book_id": 77},
{"id": 15, "user_id": 8, "device_id": 1, "book_id": 77},
{"id": 13, "user_id": 8, "device_id": 1, "book_id": 75}]
我想要的是这样的:
new_list = [
{'id': 20, 'user_id': 8, 'device_id': 1, 'book_id': 81},
{'id': 17, 'user_id': 8, 'device_id': 1, 'book_id': 78},
{'id': 16, 'user_id': 8, 'device_id': 1, 'book_id': 77},
{'id': 13, 'user_id': 8, 'device_id': 1, 'book_id': 75}]
用这个示例列表执行下面的代码效果很好,我得到了想要的结果。但是在我的 JSON 文件数据上运行时遇到了一些问题,无法正确分组 它会删除一些重复的值,但不是全部:
for key, value in groupby(book_list, key=lambda v: v["book_id"]):
newlist.append(max(list(value), key=lambda v: v["id"]))
我也尝试了这段代码,它可以删除所有重复的数据,但它会得到一个具有最小 id 的数据(它实际上覆盖了最后一个字典):
new_list = list({v['book_id']: v for v in book_list}.values())
我更喜欢可以在 O(1) 中完成的代码行(如果可能的话)
【问题讨论】:
-
为什么不保留一组
book_id并在遇到它们时用它来过滤它们?
标签: python json list dictionary