2017-04-10 182 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()