Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-在列表中查找重复项并按键将其分组_Python - Fatal编程技术网

Python-在列表中查找重复项并按键将其分组

Python-在列表中查找重复项并按键将其分组,python,Python,我有一个类似于以下内容的python dict列表: [{ 'id': 1, 'name': 'name1' }, { 'id': 2, 'name': 'name2' }, { 'id': 3, 'name': 'name1' }] 我想做的是创建一个新的字典列表,只包含那些键“name”重复的字典,并对它们进行分组 [{ 'id1': 1, 'id2': 3, 'name': 'name1' }] 第一个列表是SQL

我有一个类似于以下内容的python dict列表:

[{
    'id': 1,
    'name': 'name1'
}, {
    'id': 2,
    'name': 'name2'
}, {
    'id': 3,
    'name': 'name1'
}]
我想做的是创建一个新的字典列表,只包含那些键“name”重复的字典,并对它们进行分组

[{
    'id1': 1,
    'id2': 3,
    'name': 'name1'
}]
第一个列表是SQL查询输出,我需要删除键“name”重复的行,只保留一行。

您可以使用itertools.groupby:

输出:

[{'name': 'name1', 'id1': 1, 'id2': 3}]
您可以使用集合。计数器:

这将产生:

[{'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'}]
[{'name': 'name1', 'id1': 1, 'id2': 3}]
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'}]