在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))