如何在Python中高效地基于字典键的值对字典列表进行分类?

3

我在Python中有一个字典列表,我想根据其中一个特定键的值对它们进行分类,并单独处理每个类别。我不知道这些值是什么,我只知道存在一个特殊的键。以下是该列表:

dictList = [
            {'name': 'name1', 'type': 'type1', 'id': '14464'}, 
            {'name': 'name2', 'type': 'type1', 'id': '26464'},
            {'name': 'name3', 'type': 'type3', 'id': '36464'},
            {'name': 'name4', 'type': 'type5', 'id': '43464'},
            {'name': 'name5', 'type': 'type2', 'id': '68885'}
            ]

这是我目前使用的代码:
while len(dictList):
    category = [l for l in dictList if l['type'] == dictList[0]['type']]
    processingMethod(category)
    for item in category:
        dictList.remove(item)

这个列表的迭代将会给我以下结果:
Iteration 1:
            category = [
                        {'name': 'name1', 'type': 'type1', 'id': '14464'}, 
                        {'name': 'name2', 'type': 'type1', 'id': '26464'},
                        ]

Iteration 2:
            category = [
                        {'name': 'name3', 'type': 'type3', 'id': '36464'}
                        ]

Iteration 3:
            category = [
                        {'name': 'name4', 'type': 'type5', 'id': '43464'}
                        ]

Iteration 4:
            category = [
                        {'name': 'name5', 'type': 'type2', 'id': '68885'}
                        ]

每次获取一个类别,处理它并最终删除已处理的项目以遍历剩余项,直到没有剩余项。有什么更好的想法吗?

预期结果是什么? - thefourtheye
2个回答

5

你的代码可以使用itertools.groupby进行重写。

for _, category in itertools.groupby(dictList, key=lambda item:item['type']):
    processingMethod(list(category))

如果processingMethod可以处理iterable

for _, category in itertools.groupby(dictList, key=lambda item:item['type']):
    processingMethod(category)

我不知道这个存在!这比我的解决方案好多了。 - Lily Chung
你的答案看起来非常棒,我会尝试一下并告诉你结果。 - Zeinab Abbasimazar
感谢您的回答@mskimm。它完全符合我的问题。 - Zeinab Abbasimazar
1
@ZeinabAbbasi 我只想补充一点,所有的组必须在一起;也就是说,你不能有一个类型为1的元素,然后是一个类型为2的元素,再然后是另一个类型为1的元素。相反,所有类型为1的元素必须在原始列表中放在一起。如果它们不能保证在一起,那么需要先运行 dictList.sort(key=lambda item: item['type']) - Lily Chung

1
如果对于dictList中的每个ll['type']都是可哈希的,这里提供一种可能的、有点优雅的解决方案:
bins = {}

for l in dictList:
    if l['type'] in bins:
        bins[l['type']].append(l)
    else:
        bins[l['type']] = [l]

for category in bins.itervalues():
   processingMethod(category)

首先,我们将使用l['type']作为键将所有的l分类到不同的箱子中;其次,我们将处理每个箱子中的内容。
如果不能保证dictList中的每个ll['type']是可哈希的,那么这种方法基本上是相同的,但我们必须使用元组列表而不是字典,这意味着效率会稍低一些。
bins = []

for l in dictList:
    for bin in bins:
        if bin[0] == l['type']:
            bin[1].append(l)
            break
    else:
        bins.append((l['type'], [l]))

for _, category in bins:
   processingMethod(category)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接