python - 如何从字典列表中删除重复项?
问题描述
我在python中有一个字典列表,如下所示:
[{'category': 'software', 'name': 'irssi', 'version': '1.2.0'},
{'category': 'software', 'name': 'irssi', 'version': '1.1.2'},
{'category': 'software', 'name': 'hexchat', 'version': '2.14.2'}]
(解析一些数据txt文件)
我想做的事:
如果类别和名称相同,我想保留包条目的第一个外观并删除其余部分,因此最终输出如下所示:
[{'category': 'software', 'name': 'irssi', 'version': '1.2.0'},
{'category': 'software', 'name': 'hexchat', 'version': '2.14.2'}]
我应该如何实现这一目标?我尝试将字典列表转换为字典,然后对其进行迭代,dict.items()
但没有运气。
解决方案
使用 aset
来跟踪(category, name)
您已经看到的所有对:
lst = [
{'category': 'software', 'name': 'irssi', 'version': '1.2.0'},
{'category': 'software', 'name': 'irssi', 'version': '1.1.2'},
{'category': 'software', 'name': 'hexchat', 'version': '2.14.2'}
]
seen = set()
result = []
for dic in lst:
key = (dic['category'], dic['name'])
if key in seen:
continue
result.append(dic)
seen.add(key)
print(result)
# output: [{'category': 'software', 'name': 'irssi', 'version': '1.2.0'},
# {'category': 'software', 'name': 'hexchat', 'version': '2.14.2'}]
这可以概括为一个函数:
def keep_first(iterable, key=None):
if key is None:
key = lambda x: x
seen = set()
for elem in iterable:
k = key(elem)
if k in seen:
continue
yield elem
seen.add(k)
>>> list(keep_first(lst, lambda d: (d['category'], d['name'])))
[{'category': 'software', 'name': 'irssi', 'version': '1.2.0'},
{'category': 'software', 'name': 'hexchat', 'version': '2.14.2'}]
推荐阅读
- function - 如何在 c 文件中使用长命令运行系统功能?
- python-3.x - 如何使用已知顶点坐标的三角形生成 Mayavi triangular_mesh 的“三角形”参数
- angular - Angular firebase 有很多变量
- c# - 为什么用户输入的最小数字没有被添加到列表中?
- javascript - 如何将文本复制到剪贴板?
- rust - 如何使用 Tokio 从子进程的 stdout 和 stderr 异步读取?
- single-page-application - Apple Watch 中的 PWA 和 SPA 支持
- aws-lambda - 无服务离线类型错误:无法读取 null 的属性“accessKeyId”
- twitter-bootstrap - 推特应用审核需要多长时间?
- java - Java 中的布局问题 - 在 JFrame 底部设置一个 20% 不透明的面板