我有一个类似于此的列表:
[
{'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!
答案 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'}]