在列表python中删除dict的相等值

时间:2013-06-14 14:31:30

标签: python python-2.7

我在列表中得到了词典:

[{'Name':'John','Age':'20'},{'Name':'John','Age':'22'},{'Name':'John','Age':'23'},{'Name':'Marie','Age':'20'}]

我只想要[{'Name':'John','Age':'23'},{'Name':'Marie','Age':'20'}] 我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:4)

您可以使用名称作为键将值输入到另一个dict中,如果您添加相同的名称两次,它会破坏旧条目,这会产生按名称统一列表的效果。

data_structure = [{'Name':'John','Age':'20'},{'Name':'John','Age':'22'},{'Name':'John','Age':'23'},{'Name':'Marie','Age':'20'}]
d={}
for x in data_structure:
    d[x['Name']] = x

d.values()
>>> [{'Age': '23', 'Name': 'John'}, {'Age': '20', 'Name': 'Marie'}]

更新:根据用户输入删除条目

data_structure = [{'Name':'John','Age':'20'},{'Name':'John','Age':'22'},{'Name':'John','Age':'23'},{'Name':'Marie','Age':'20'}]

while 1:
    name = raw_input("Enter Name: ")
    if not len(name): break
    age = int(raw_input("Enter Age: "))
    flag=1
    while flag:
        for idx, d in enumerate(data_structure):
            if 'Name' in d and \
                'Age' in d and \
                int(d['Age']) != age and \
                d['Name'] == name:
                data_structure.pop(idx)
                flag=2
                break
        flag-=1

答案 1 :(得分:2)

在我看来,将Name映射到Age的数据结构在这里更合适({'John':23})。在这种情况下,我将创建一个字典,将名称映射到年龄列表,然后我将仅使用最大年龄重新创建列表...

from collections import defaultdict
d = defaultdict(list)
for dd in lst:
    name,age = dd['Name'],dd['Age']
    d[name].append(age)
new_list = [{'Name':n,'Age':max(ages)} for n,ages in d.items()] 

答案 2 :(得分:1)

要做的第一件事是将所考虑的项目分组。在您的情况下,具有相同Name值的2个dicts相等:

编辑 - 要使用groupby,这些项必须彼此相邻。一种快速的方法是使用相同的名称进行排序,获取lambda:

nameL = lambda x: x['Name']
equals = groupby(sorted(a, key=nameL), key=nameL)

然后,你必须选择(在这里,随意,用任何选择方法替换choice

from random import choice
res = []
for name, items in equals:
    res.append(choice(list(items)))

答案 3 :(得分:1)

另一种选择:

d = [{'Name':'John','Age':'20'},{'Name':'John','Age':'22'},{'Name':'John','Age':'23'},{'Name':'Marie','Age':'20'}]
import itertools
d = sorted(d, key=lambda x: (x['Name'], x['Age']))
grouped_by_name = itertools.groupby(d, lambda x: x['Name'])
[list(entries)[-1] for name, entries in grouped_by_name]
# [{'Age': '23', 'Name': 'John'}, {'Age': '20', 'Name': 'Marie'}]