我有一个像这样的python字典列表:
[{
'id': 1,
'name': 'name1'
}, {
'id': 2,
'name': 'name2'
}, {
'id': 3,
'name': 'name1'
}]
我想做的是创建一个新的字典列表,仅包含重复了键“名称”的字典,并将其分组。
[{
'id1': 1,
'id2': 3,
'name': 'name1'
}]
第一个列表是一个SQL查询输出,我需要删除重复了键“名称”的行,仅保留一个。
答案 0 :(得分:1)
您可以使用itertools.groupby
:
import itertools
d = [{'id': 1, 'name': 'name1'}, {'id': 2, 'name': 'name2'}, {'id': 3, 'name': 'name1'}]
new_data = [[a, list(b)] for a, b in itertools.groupby(sorted(d, key=lambda x:x['name']), key=lambda x:x['name'])]
final_dicts = [{'name':a, **{f'id{i}':a['id'] for i, a in enumerate(b, 1)}} for a, b in new_data if len(b) > 1]
输出:
[{'name': 'name1', 'id1': 1, 'id2': 3}]
答案 1 :(得分:0)
我建议您使用以下解决方案,非常易于阅读和理解:
从集合中导入defaultdict
ds = [{'id': 1, 'name': 'name1'},
{'id': 2, 'name': 'name2'},
{'id': 3, 'name': 'name1'}]
newd = defaultdict(list)
for d in ds:
newd[d['name']].append(d['id'])
# Here newd is {'name1': [1, 3], 'name2': [2]}
result = []
for k,v in newd.items():
if len(v) > 1:
d = {f'id{i}':i for i in v}
d['name'] = k
result.append(d)
print(result) # [{'id1': 1, 'id3': 3, 'name': 'name1'}]
答案 2 :(得分:-2)
您可以使用collections.Counter
:
from collections import Counter
from operator import itemgetter
l = [{'id': 1, 'name': 'name1'}, {'id': 2, 'name': 'name2'}, {'id': 3, 'name': 'name1'}]
print([{'name': n, **{'id%d' % i: d['id'] for i, d in enumerate([d for d in l if d['name'] == n], 1)}} for n, c in Counter(map(itemgetter('name'), l)).items() if c > 1])
这将输出:
[{'name': 'name1', 'id1': 1, 'id2': 3}]