-1

我在列表中得到了 dict:

[{'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

4 回答 4

4

您可以使用名称作为键将值输入另一个字典,如果您添加两次相同的名称,它会破坏旧条目,这具有按名称唯一化您的列表的效果。

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
于 2013-06-14T14:38:46.457 回答
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()] 
于 2013-06-14T14:38:16.823 回答
1

首先要做的是将被视为相等的项目分组。在您的情况下,具有相同Name值的 2 个字典相等:

编辑 - 要使用 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)))
于 2013-06-14T14:46:36.970 回答
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'}]
于 2013-06-14T14:47:55.457 回答