2016-08-19 132 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 
相關問題