2017-04-10 148 views
0

我想从下面的列表中删除重复项的列表中删除重复项关键从字典蟒蛇

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}] 
词典

根据病情,如果“文档”键值文本是相同的,则字典应该是一个除去。我已经尝试了以下解决方案

distinct_cur = [dict(y) for y in set(tuple(x.items()) for x in cur)] 

但是重复项仍存在于最终列表中。

下面是在第1和的关键“DOC”值第二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': 2, 'mtc': 1, 'doc': 'test', 'foc': 45, 'st': 0.8, 'htc': 12, '_id': ObjectId('58e8d03958ae6d180c2b4446'), 'ftc': 0}] 

提前感谢!

+0

它会更好,如果你能提供一个样本输出。 – JRodDynamite

+0

您不允许在字典中使用重复键。你的意思是通过删除重复的密钥?应该删除什么? – Kasramvd

+1

因此,当你找到具有相同'doc'键的字典后,你如何决定哪一个应该被删除? – Kasramvd

回答

3

您正在创建一个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() 
0

试试这个:

distinct_cur =[dict(t) for t in set([tuple(d.items()) for d in distinct_cur])] 

为我工作...

1

我看到2个依赖于你的域的问题类似的解决方案:你想保持第一个密钥实例或最后实例?

使用最后(以覆盖以前的比赛)是简单的:

d = {r['doc']: r for r in distinct_cur}.values()