从词典列表中的词典列表中删除重复项

时间:2016-07-26 15:05:19

标签: python python-2.7 dictionary

我有清单:

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:不可用类型:'dict'

有人可以帮我解决这个问题吗?

4 个答案:

答案 0 :(得分: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'}]

答案 1 :(得分:0)

集合只能有hashable个成员,既没有列表也没有dicts - 但可以检查它们是否相等。

你可以做到

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

这对于真正的大名单来说可能很慢

答案 2 :(得分:0)

尝试使用此代码:

In [347]: my_list
Out[347]: 
[{'account': [{'name': 'a'}, {'name': 'b'}], 'date': '10.06.2016'},
 {'account': [{'name': 'a'}], 'date': '22.06.2016'}]

这是您在运行上述代码段后获得的内容:

void MyButton::onPressed(wxCommandEvent& event) {
    if (CONDITION) {
        SetValue(false);
    }
}

答案 3 :(得分: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'} ] } ]