我正在尝试从以下列表中删除重复项
distinct_cur = [{'rtc': 0, 'vf': 0, 'mtc': 0, 'doc': 'good job', 'foc': 195, 'st': 0.0, 'htc': 2, '_id': ObjectId('58e86a550a0aeff4e14ca6bb'), 'ftc': 0},
{'rtc': 0, 'vf': 0, 'mtc': 0, 'doc': 'good job', 'foc': 454, 'st': 0.8, 'htc': 1, '_id': ObjectId('58e8d03958ae6d179c2b4413'), 'ftc': 1},
{'rtc': 0, 'vf': 2, 'mtc': 1, 'doc': 'test', 'foc': 45, 'st': 0.8, 'htc': 12, '_id': ObjectId('58e8d03958ae6d180c2b4446'), 'ftc': 0}]
字典基于以下条件:如果'doc'键值文本相同,则应删除其中一个字典。我尝试了以下解决方案
distinct_cur = [dict(y) for y in set(tuple(x.items()) for x in cur)]
但最终列表中仍然存在重复项。
下面是所需的输出,因为第一个和第二个distinct_cur文本的关键'doc'值是相同的(好工作):
[{'rtc': 0, 'vf': 0, 'mtc': 0, 'doc': 'good job', 'foc': 195, 'st': 0.0, 'htc': 2, '_id': ObjectId('58e86a550a0aeff4e14ca6bb'), 'ftc': 0},
{'rtc': 0, 'vf': 2, 'mtc': 1, 'doc': 'test', 'foc': 45, 'st': 0.8, 'htc': 12, '_id': ObjectId('58e8d03958ae6d180c2b4446'), 'ftc': 0}]
提前致谢!
答案 0 :(得分:4)
您正在使用不同的元素创建set
,并期望它会根据您只知道的标准删除重复项。
您必须遍历列表,并且仅当doc
具有与先前值不同的值时才添加到结果列表:
比如像这样:
done = set()
result = []
for d in distinct_cur:
if d['doc'] not in done:
done.add(d['doc']) # note it down for further iterations
result.append(d)
通过在辅助集中注册已知密钥,只保留具有相同doc
密钥的字典的第一个匹配项。
另一种可能性是使用带有键的字典作为字典的"doc"
键,在列表中向后迭代,以便第一项覆盖列表中的最后一项:
result = {i['doc']:i for i in reversed(distinct_cur)}.values()
答案 1 :(得分:2)
我看到2个类似的解决方案依赖于您的域名问题:您是要保留密钥的第一个实例还是 last 实例?
使用 last (以覆盖之前的匹配)更简单:
d = {r['doc']: r for r in distinct_cur}.values()
答案 2 :(得分:1)
一个衬里可以对distinct_cur
的primary_key上的字典doc
进行重复数据删除
[i for n, i in enumerate(distinct_cur) if i.get('doc') not in [y.get('doc') for y in distinct_cur[n + 1:]]]
答案 3 :(得分:0)
试试这个:
distinct_cur =[dict(t) for t in set([tuple(d.items()) for d in distinct_cur])]
为我工作......