我在列表中得到了词典:
[{'Name':'John','Age':'20'},{'Name':'John','Age':'22'},{'Name':'John','Age':'23'},{'Name':'Marie','Age':'20'}]
我只想要[{'Name':'John','Age':'23'},{'Name':'Marie','Age':'20'}]
我怎样才能做到这一点?
答案 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'}]