2016-08-19 133 views
1

我有一个很长的字典列表,大部分字典不重叠。但是,一些字典具有相同的“名称”字段,我只喜欢字典列表中的唯一名称。我希望名称的第一次出现是停留的,并且之后从列表中删除。Python - 返回具有唯一键的字典列表:值对

我已经把名单下面来说明情况:

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'} 
] 

我想这个列表返回第一“约翰”和凯西,但不是第二或第三约翰及他们的相关信息。

一个可以接受的,但并非最佳的解决方案也不会有相同名称的字典彼此相邻。

+4

你有没有试图自行解决这个问题?如果您向我们展示您的尝试,您通常会在StackOverflow中获得更好的响应/接收,而不仅仅是通过示例输入提供问题范围。 –

回答

2

您可以在列表中运行并保留唯一名称的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 
+0

'集合'不保证元素是有序的。这使得答案无关紧要,因为OP要求名称的第一次出现。 – u8y7541

+3

@ u8y7541再次阅读答案 - 该集合仅用于跟踪唯一性。顺序来自迭代输入列表,并且结果列表保留相同的顺序。 – Mureinik

+0

如果不是名称中的d ['Name']: 这正是我一直在寻找的。我从来没有使用过 – sastrup

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'}] 

注意:单线程将包含每个名称的第一个匹配项,但它将返回一个任意排序的列表。

1

您可以轻松地为此写一个for-loop。

def getName(name): 
    '''Gets first occurence of name in list of dicts.''' 
    for i in myList: 
     if i['Name'] == name: 
      return i 
相关问题