2016-07-26 2 views
1

У меня есть список:Удалить дубликаты из списка словарей в списке словарей

my_list = [{'date': '10.06.2016', 
      'account': [{'name': 'a'}, 
         {'name': 'a'}, 
         {'name': 'b'}, 
         {'name': 'b'}]}, 
      {'date': '22.06.2016', 
      'account': [{'name': 'a'}, 
         {'name': 'a'}]}] 

Я хочу удалить дубликаты из списка словарей в 'account':

my_list = [{'date': '10.06.2016', 
      'account': [{'name': 'a'}, 
         {'name': 'b'}]}, 
      {'date': '22.06.2016', 
      'account': [{'name': 'a'}]}] 

При использовании set, я получаю следующая ошибка:

TypeError: unhashable type: 'dict'

Может ли кто-нибудь помочь мне с этим pr oblem?

ответ

0
def deduplicate_account_names(l): 
    for d in l: 
     names = set(map(lambda d: d.get('name'), d['account'])) 
     d['account'] = [{'name': name} for name in names] 

# even shorter: 
# def deduplicate_account_names(l): 
#  for d in l: 
#   d['account'] = [{'name': name} for name in set(map(lambda d: d.get('name'), d['account']))] 

my_list = [{'date': '10.06.2016', 
      'account': [{'name': 'a'}, 
         {'name': 'a'}, 
         {'name': 'b'}, 
         {'name': 'b'}]}, 
      {'date': '22.06.2016', 
      'account': [{'name': 'a'}, 
         {'name': 'a'}]}] 

deduplicate_account_names(my_list) 
print(my_list) 

# [ {'date': '10.06.2016', 
# 'account': [ {'name': 'a'}, 
#     {'name': 'b'} ] }, 
# {'date': '22.06.2016', 
# 'account': [ {'name': 'a'} ] } ] 
+0

Thx, это работает отлично – Jenny

0

Наборы могут содержать только hashable членов, и ни списки, ни дикты - но их можно проверить на равенство.

вы можете сделать

def without_duplicates(inlist): 
    outlist=[] 
    for e in inlist: 
     if e not in outlist: 
      outlist.append(e) 
    return outlist 

это может быть медленным для действительно больших списков

1

Эта структура является, вероятно, более сложный, но он получает работу.

my_list = [{'date': '10.06.2016', 
      'account': [{'name': 'a'}, 
         {'name': 'a'}, 
         {'name': 'b'}, 
         {'name': 'b'}]}, 
      {'date': '22.06.2016', 
      'account': [{'name': 'a'}, 
         {'name': 'a'}]}] 

>>> [{'date': date, 
     'account': [{'name': name} for name in group] 
     } for group, date in zip([set(account.get('name') 
            for account in item.get('account')) 
           for item in my_list], 
           [d.get('date') for d in my_list])] 
[{'account': [{'name': 'a'}, {'name': 'b'}], 'date': '10.06.2016'}, 
{'account': [{'name': 'a'}], 'date': '22.06.2016'}] 
0

Дайте этот код попробовать:

for d in my_list: 
    for k in d: 
     if k == 'account': 
      v = [] 
      for d2 in d[k]: 
       if d2 not in v: 
        v.append(d2) 
      d[k] = v 

Это то, что вы получите после выполнения фрагмента кода выше:

In [347]: my_list 
Out[347]: 
[{'account': [{'name': 'a'}, {'name': 'b'}], 'date': '10.06.2016'}, 
{'account': [{'name': 'a'}], 'date': '22.06.2016'}] 
Смежные вопросы