如何在python中用相似的索引/属性对元组/对象列表进行分组?

2024-04-23 07:47:15 发布

您现在位置:Python中文网/ 问答频道 /正文

给出一个清单

old_list = [obj_1, obj_2, obj_3, ...]

我要创建一个列表:

new_list = [[obj_1, obj_2], [obj_3], ...]

其中obj_1.some_attr == obj_2.some_attr

我可以抛出一些for循环和if检查,但这很难看。这有什么Python的方法吗?顺便说一下,对象的属性都是字符串。

或者,也可以理解包含元组(长度相同)而不是对象的列表的解决方案。


Tags: 对象方法字符串obj列表newforif
3条回答

^{}就是这样做的。

虽然for循环在很大程度上是必需的,但是if语句不是必需的

from collections import defaultdict


groups = defaultdict(list)

for obj in old_list:
    groups[obj.some_attr].append(obj)

new_list = groups.values()

这里有两个案子。两者都需要以下进口:

import itertools
import operator

您将使用itertools.groupbyoperator.attrgetteroperator.itemgetter

对于按obj_1.some_attr == obj_2.some_attr分组的情况:

get_attr = operator.attrgetter('some_attr')
new_list = [list(g) for k, g in itertools.groupby(sorted(old_list, key=get_attr), get_attr)]

对于a[some_index] == b[some_index]

get_item = operator.itemgetter(some_index)
new_list = [list(g) for k, g in itertools.groupby(sorted(old_list, key=get_item), get_item)]

请注意,您需要排序,因为当键的值更改时,itertools.groupby将生成一个新组。


注意,您可以使用它创建一个类似S.Lott的答案的dict,但不必使用collections.defaultdict

使用字典理解(仅适用于Python3+,也可能适用于Python2.7,但我不确定):

groupdict = {k: g for k, g in itertools.groupby(sorted_list, keyfunction)}

对于以前版本的Python,或者作为更简洁的替代:

groupdict = dict(itertools.groupby(sorted_list, keyfunction))

你也可以尝试使用itertools.groupby。请注意,下面的代码只是一个示例,应根据您的需要进行修改:

data = [[1,2,3],[3,2,3],[1,1,1],[7,8,9],[7,7,9]]

from itertools import groupby

# for example if you need to get data grouped by each third element you can use the following code
res = [list(v) for l,v in groupby(sorted(data, key=lambda x:x[2]), lambda x: x[2])]# use third element for grouping

相关问题 更多 >