2016-07-26 254 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'

有人可以幫我解決這個問題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'}]