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

在python中,如何按类似的索引/属性对元组/对象列表进行分组?,python,list,grouping,Python,List,Grouping,给你一张单子 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语句则

给你一张单子

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
语句则不是

from collections import defaultdict


groups = defaultdict(list)

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

new_list = groups.values()

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

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

这里有两个案例。两者都需要以下导入:

import itertools
import operator
您将使用and或or

对于按
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[某些索引]==b[某些索引]

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

使用字典理解(仅适用于Python 3+,可能还适用于Python 2.7,但我不确定):

对于Python的早期版本,或者作为更简洁的替代方案:

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

当然,这并不保留(或以任何方式尊重)群体的原始秩序。因此它可能是也可能不是@drus想要的。@jollybox.de:“不保留(或以任何方式尊重)群体的原始秩序”是正确的。这是什么时候成为一项要求的?我不知道这是否是一项要求,最初的问题并不清楚。我最初是这样理解这个问题的。不过,答案还是不错的。我刚刚意识到,如果您将
dict
的用法与
itertools.groupby
答案结合使用,您甚至不需要使用
defaultdict
。是否应该调用
list(groups.values())
来实际返回OP想要的内容?我的意思是,否则,如果调用
new\u list[0]
,她会得到
TypeError:“dict\u values”对象不支持索引
(在我的机器上),基本上是我的答案,但你忘了一个重要方面:在使用
groupby
@JAB之前排序-你的真相。谢谢你注意到我。@JAB-为什么在使用groupby之前需要排序?@sahilchabra阅读我的答案,我说为什么。“包含元组(长度相同)而不是对象的列表”这是否意味着包含长度相同的元组的列表?如果是,元组分组的“属性”是什么顺便说一句,元组是对象,不是吗?@eyquem:1。对2.元组按某个索引分组。索引中的项是一个字符串。;3.我相信是的,。。。但我不确定。:-)
groupdict = dict(itertools.groupby(sorted_list, keyfunction))