2016-08-19 3 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'} 
] 

я хотел бы этот список, чтобы вернуть первый «Джона» и Кэти, но не второй или третий Johns и их связанной информации.

Допустимое, но не оптимальное решение также не будет иметь словарей с тем же именем рядом друг с другом.

+4

Вы предпринимали какие-либо попытки решить эту проблему самостоятельно? Вы, как правило, получите гораздо лучшие ответы/прием здесь, в StackOverflow, если вы покажете нам свои попытки, а не просто предоставите область проблем с образцом ввода. –

ответ

2

Вы можете запустить список и сохранить set уникальных имен. Каждый раз, когда вы сталкиваетесь с новым именем (т.е. имя, которое не входит в комплект), вы добавляете его в набор и соответствующих 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 
+0

'set' не гарантирует, что элементы в порядке. Это делает ответ несущественным, потому что OP хочет * first * появления имени. – 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

Вы можете легко написать для цикла для этого.

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