dicts列表:删除重复项并将唯一值堆叠在一起

时间:2016-07-26 13:58:08

标签: python list python-3.x dictionary

我有一个类似于此的列表:

[
    {'code': 'ABCDEFGH',
     'message':'Everything is not OK',
     'name': 'Tom Sawyer',
     'course': 'Networks'},

    {'code': 'ABCDEFGH',
     'message':'Alright',
     'name': 'Julien Sorel',
     'course': 'Networks'},

    {'code': 'KQPRADBC',
     'message':'Hello there',
     'name': 'Jacques Paganel',
     'course': 'Cooking'},

    {'code': 'KQPRADBC',
     'message':'Hello there',
     'name': 'Jacques Paganel',
     'course': 'Cooking'},
]

我希望它看起来像这样:

[
    {'code': 'ABCDEFGH',
     'message': ['Everything is not OK', 'Alright'],
     'name': ['Tom Sawyer', 'Julien Sorel'],
     'course': 'Networks'},

    {'code': 'KQPRADBC',
     'message':'Hello there',
     'name': 'Jacques Paganel',
     'course': 'Cooking'},
]

因此,将删除完全重复的条目,并且具有唯一字典值的条目将合并到列表中。订单并不重要。

对我来说,这看起来像是一个巨大的黑客。提前谢谢。

! Python 3.5!

2 个答案:

答案 0 :(得分:1)

为了保证使用相当简单的可读代码实现单一性,可以使用集合。请参阅代码中的注释。

我建议,假设lst包含您的词典列表:

res = list()  # start from scratch
for k in lst:
    for d in res:  # check the previously created entries
        if d['code'] == k['code']:
            # add to entry
            for field in ['message', 'name', 'course']:
                d[field].add(k[field])  # will not do anything if value is already here
            break
    else:  # this will be executed if the for didn't break
        # create new entry
        tmp = {'code': k['code']}
        for field in ['message', 'name', 'course']:
            tmp[field] = set([k[field]])
        res.append(tmp)
print res

以词典列表作为条目,我得到以下内容:

[
{'course': set(['Networks']),
'message': set(['Alright', 'Everything is not OK']),
'code': 'ABCDEFGH',
'name': set(['Julien Sorel', 'Tom Sawyer'])},

{'course': set(['Cooking']),
'message': set(['Hello there']),
'code': 'KQPRADBC',
'name': set(['Jacques Paganel'])}
]

如果你想要在问题中写出完全相同的输出,你可能想在最后添加这样的东西:

for d in res:
    for field in ['message', 'name', 'course']:
        if len(d[field]) > 1:
            d[field] = list(d[field])
        else:
            d[field] = list(d[field])[0]

答案 1 :(得分:0)

a = [
{'code': 'ABCDEFGH',
 'message':'Everything is not OK',
 'name': 'Tom Sawyer',
 'course': 'Networks'},

{'code': 'ABCDEFGH',
 'message':'Alright',
 'name': 'Julien Sorel',
 'course': 'Networks'},

{'code': 'KQPRADBC',
 'message':'Hello there',
 'name': 'Jacques Paganel',
 'course': 'Cooking'},

{'code': 'KQPRADBC',
 'message':'Hello there',
 'name': 'Jacques Paganel',
 'course': 'Cooking'},
]
out=[]
for i in set([tuple(d.items()) for d in a]):
    out.append(dict(i))
print out

<强>输出:

[{'course': 'Cooking', 'message': 'Hello there', 'code': 'KQPRADBC', 'name': 'Jacques Paganel'},
{'course': 'Networks', 'message': 'Everything is not OK', 'code': 'ABCDEFGH', 'name': 'Tom Sawyer'},
{'course': 'Networks', 'message': 'Alright', 'code': 'ABCDEFGH', 'name': 'Julien Sorel'}]