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