我有很长的词典列表,大部分都没有重叠。但是,有些词典具有相同的名称'字段和我只喜欢字典列表中的唯一名称。我希望第一次出现的名称是保留名称,然后从列表中删除。
我在下面列出了一个简短的清单来说明情景:
myList = [
{'Name':'John', 'Age':'50', 'Height':'70'},
{'Name':'Kathy', 'Age':'43', 'Height':'65'},
{'Name':'John','Age':'46','Height':'68'},
{'Name':'John','Age':'50','Height':'72'}
]
我希望此列表能够返回第一个' John'和Kathy,但不是第二或第三个Johns及其相关信息。
一个可接受但不是最优的解决方案也是没有彼此相邻的字典。
答案 0 :(得分:3)
您可以在列表上运行并保留set
个唯一名称。每当您遇到一个新名称(即,该组中的名称不是该名称)时,您将其添加到集合中,并将相应的字典添加到结果中:
def uniqueNames(dicts):
names = set()
result = []
for d in dicts:
if not d['Name'] in names:
names.add(d['Name'])
result.append(d)
return result
答案 1 :(得分:1)
您可以轻松地为此编写for循环。
def getName(name):
'''Gets first occurence of name in list of dicts.'''
for i in myList:
if i['Name'] == name:
return i
答案 2 :(得分:0)
初始清单:
my_list = [
{'Name':'John', 'Age':'50', 'Height':'70'},
{'Name':'Kathy', 'Age':'43', 'Height':'65'},
{'Name':'John','Age':'46','Height':'68'},
{'Name':'John','Age':'50','Height':'72'}
]
逻辑(可能是新手更友好)的方式:
names = set()
new_list = []
for d in my_list:
name = d['Name']
if name not in names:
new_list.append(d)
names.add(d['Name'])
print new_list # [{'Age': '50', 'Name': 'John', 'Height': '70'}, {'Age': '43', 'Name': 'Kathy', 'Height': '65'}]
单行方式:
new_list = {d['Name']: d for d in reversed(my_list)}.values()
print new_list # [{'Age': '43', 'Name': 'Kathy', 'Height': '65'}, {'Age': '50', 'Name': 'John', 'Height': '70'}]
注意:单行将包含每个名称的第一个匹配项,但它将返回一个任意排序的列表。