2016-07-27 126 views
2

的蟒蛇名單上有一種低於詞典:查找重複的字典

a = [{'un': 'a', 'id': "cd"}, {'un': 'b', 'id': "cd"},{'un': 'b', 'id': "cd"}, {'un': 'c', 'id': "vd"}, 
    {'un': 'c', 'id': "a"}, {'un': 'c', 'id': "vd"}, {'un': 'a', 'id': "cm"}] 

我需要通過「聯合國」鍵,例如該{「聯合國」查找字典的重複:「A」, 'id':「cd」}和這個{'un':'a','id':「cm」}第二,當密鑰'un'的值被重複時,重複被找到我需要作出決定什麼字典繼續關注其關鍵'id'的第二個值,例如我們保留字典值爲「cm」的字典。

我已經取得了冷杉步驟參見下面的代碼:

from collections import defaultdict 
temp_ids = [] 
dup_dict = defaultdict(list) 
for number, row in enumerate(a): 
    id = row['un'] 
    if id not in temp_ids: 
     temp_ids.append(id) 
    else: 
     tally[id].append(number) 

使用這個代碼,我或多或少能找到重複的列表索引,也許有其他的方法來做到這一點。而且我還需要下一步代碼來決定什麼是字典,什麼是省略。將非常感激的幫助。

+0

你需要使用這個詞典的列表嗎?數據框可能更適合這種類型的任務 –

+0

您是要求查找它們自己的重複項還是在'['un']'處重複了值? – Aaron

+0

重複的值 – Yan

回答

0

您可以使用其他字典,以分類您的字典基於'un'鍵,然後根據id選擇期望物件:

>>> from collections import defaultdict 
>>> 
>>> d = defaultdict(list) 
>>> 
>>> for i in a: 
...  d[i['un']].append(i) 
... 
>>> d 
defaultdict(<type 'list'>, {'a': [{'un': 'a', 'id': 'cd'}, {'un': 'a', 'id': 'cm'}], 'c': [{'un': 'c', 'id': 'vd'}, {'un': 'c', 'id': 'a'}, {'un': 'c', 'id': 'vd'}], 'b': [{'un': 'b', 'id': 'cd'}, {'un': 'b', 'id': 'cd'}]}) 
>>> 
>>> keeps = {'a': 'cm', 'b':'cd', 'c':'vd'} # the key is 'un' and the value is 'id' should be keep for that 'un' 
>>> 
>>> [i for key, val in d.items() for i in val if i['id']==keeps[key]] 
[{'un': 'a', 'id': 'cm'}, {'un': 'c', 'id': 'vd'}, {'un': 'c', 'id': 'vd'}, {'un': 'b', 'id': 'cd'}, {'un': 'b', 'id': 'cd'}] 
>>> 

在最後一行(嵌套列表理解)我們遍歷所有的集合字典的項目然後超過值,並將這些項目保留在後面的值或條件中,即i['id']==keeps[key]這意味着我們將保留具有keeps字典中指定值的id的項目。

可以喙列表理解到這樣的事情:

final_list = [] 
for key, val in d.items(): 
    for i in val: 
     if i['id']==keeps[key]: 
      final_list.append(i) 

注意,因爲列表解析的迭代中C已完成,它比常規的Python循環和在Python的方式去非常快。但如果表現對你不重要,你可以使用常規方法。

+0

你能否最後簡單解釋一下你的班輪? – Yan

+0

@Yan看看更新! – Kasramvd

0

你幾乎在正確的軌道上與defaultdict ...這裏大概是我會寫它。

from collections import defaultdict 
a = [{'un': 'a', 'id': "cd"}, {'un': 'b', 'id': "cd"},{'un': 'b', 'id': "cd"}, {'un': 'c', 'id': "vd"}, {'un': 'c', 'id': "a"}, {'un': 'c', 'id': "vd"}, {'un': 'a', 'id': "cm"}] 

items = defaultdict(list) 
for row in a: 
    items[row['un']].append(row['id']) #make a list of 'id' values for each 'un' key 

for key in items.keys(): 
    if len(items[key]) > 1: #if there is more than one 'id' 
     newValue = somefunc(items[key]) #decided which of the list items to keep 
     items[key] = newValue #put that new value back into the dictionary