python - 根据给定键的值唯一性删除字典列表中的重复字典
问题描述
我有一本字典:
dicts = [
{'id': 'item1', 'type': 'foo', 'metaId': 'metaId1'},
{'id': 'item2', 'type': 'foo', 'metaId': 'metaId2'},
{'id': 'item3', 'type': 'foo3', 'metaId': 'metaId3'},
{'id': 'item4', 'type': 'foo2', 'metaId': 'metaId2'},
{'id': 'item5', 'type': 'foo3', 'metaId': 'metaId3'},
{'id': 'item6', 'type': 'foo2', 'metaId': 'metaId2'},
{'id': 'item7', 'type': 'foo3', 'metaId': 'metaId3'},
{'id': 'item8', 'type': 'foo2', 'metaId': 'metaId2'},
{'id': 'item9', 'type': 'foo3', 'metaId': 'metaId3'}]
我想遍历列表并创建一个新列表,其中包含具有键“类型”的唯一值的字典。我不在乎保留哪些字典,首先使用该键:值保留,其余的被省略。所以最后我想看看:
expected = [
{'id': 'item1', 'type': 'foo', 'metaId': 'metaId1'},
{'id': 'item3', 'type': 'foo3', 'metaId': 'metaId3'},
{'id': 'item4', 'type': 'foo2', 'metaId': 'metaId2'}
]
这是我尝试过的,绝对不是我需要的,因为它返回一个空列表。我想我很难在新的字典子列表中检查一个值以使其被排除在外
keys_to_keep = set()
expected = []
for d in dicts:
for key, value in d.items():
if value not in expected:
keys_to_keep.add(key)
remove_keys = set(d) - keys_to_keep
for d in dicts:
for k in remove_keys:
del d[k]
dicts = expected
print(dicts)
解决方案
你总是得到一个空列表的原因是因为你只是这样做:
dicts = expected
而且expected
只是一个空列表,你从来没有做过任何事情……不知道为什么你会认为expected
会改变。
但是你把事情复杂化了。只需保留一组唯一值,然后创建一个新的字典列表。
seen = set()
result = []
for d in dicts:
if d['type'] not in seen:
result.append(d)
seen.add(d['type'])
这种方法使遇到的第一个字典具有唯一性'type'
。
例如,如果您想要最后遇到的,您可以执行类似dicts
以 rerere order 进行迭代的操作,所以
for d in reversed(dicts):
...
推荐阅读
- arrays - 从添加到数组中删除项目或从数组中删除项目
- node.js - 使用节点 js 更新 mongodb 中的嵌套数组
- django - 启动 celery worker 会创建太多与 redis 的连接
- android - 在 recyclerview 的 onBindViewHolder 中显示进度条
- r - 尝试使用服务帐户而不是默认的 Windows 身份验证从 R 连接到 SQL 服务器时出现问题
- python - 如何将解析器插入 django 结构?
- database - 无法使用用于颤振桌面的 sqflite_common_ffi 插件创建数据库
- php - 如何从 Google Calendar API 获取刷新的令牌
- javascript - 当我尝试在 JavaScript 中将变量从一个函数传递给另一个函数时,出现 Reference Error: variable is not defined 错误(邮递员)
- javascript - 错误 403:“请求的身份验证范围不足”,即使相关范围已激活