Python-返回具有唯一键:值对的字典列表
我有一长串字典,大部分都没有重叠。但是,有些词典有相同的“Name”字段,我只希望在词典列表中有唯一的名称。我希望第一次出现的名字是留下来的,之后的任何名字都从列表中删除 我在下面列出了一个简短的列表来说明这个场景:Python-返回具有唯一键:值对的字典列表,python,list,python-3.x,dictionary,unique,Python,List,Python 3.x,Dictionary,Unique,我有一长串字典,大部分都没有重叠。但是,有些词典有相同的“Name”字段,我只希望在词典列表中有唯一的名称。我希望第一次出现的名字是留下来的,之后的任何名字都从列表中删除 我在下面列出了一个简短的列表来说明这个场景: myList = [ {'Name':'John', 'Age':'50', 'Height':'70'}, {'Name':'Kathy', 'Age':'43', 'Height':'65'}, {'Name':'John','Age':'46','He
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'}
]
我希望此列表返回第一个“约翰”和凯西,但不返回第二个或第三个约翰及其相关信息
一个可接受但不是最佳的解决方案是,词典之间不能相邻使用相同的名称。您可以浏览列表,并保留一组唯一的名称。每次遇到新名称(即不在集合中的名称)时,将其添加到集合中,并将相应的dict添加到结果中:
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
初步名单:
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'}
]
合乎逻辑(可能对新手更友好)的方式:
单程:
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'}]
注意:一行代码将包含每个名称的第一次出现,但它将返回任意顺序的列表。您可以轻松为此编写for循环
def getName(name):
'''Gets first occurence of name in list of dicts.'''
for i in myList:
if i['Name'] == name:
return i
你有没有尝试过自己解决这个问题?如果您向我们展示您的尝试,而不仅仅是通过示例输入提供问题范围,您通常会在StackOverflow获得更好的响应/接收。
set
s不能保证元素是有序的。这使得答案不相关,因为OP希望名称第一次出现。@u8y7541再次读取答案-该集合仅用于跟踪唯一性。顺序来自于对输入列表的迭代,结果列表保持相同的顺序。如果不是名称中的d['Name']:那正是我要找的。我以前从未用过
def getName(name):
'''Gets first occurence of name in list of dicts.'''
for i in myList:
if i['Name'] == name:
return i