簡體   English   中英

Python-在列表中查找重復項並按鍵分組

[英]Python - Find duplicates in list and group them by key

我有這樣的python字典列表:

[{
    'id': 1,
    'name': 'name1'
}, {
    'id': 2,
    'name': 'name2'
}, {
    'id': 3,
    'name': 'name1'
}]

我想要做的是創建一個新的詞典列表,僅包含重復的鍵“名稱”的詞典,並將其分組。

[{
    'id1': 1,
    'id2': 3,
    'name': 'name1'
}]

第一個列表是SQL查詢輸出,我需要刪除重復的鍵“名稱”的行,僅保留其中一個。

您可以使用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}]

我建議您使用以下解決方案,非常易於閱讀和理解:

從集合導入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'}]

您可以使用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}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM