簡體   English   中英

如何通過 python 中的相似索引/屬性對元組/對象列表進行分組?

[英]How to group a list of tuples/objects by similar index/attribute in 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檢查,但這很難看。 有沒有一種pythonic方式? 順便說一句,對象的屬性都是字符串。

或者,也可以使用包含元組(相同長度)而不是對象的列表的解決方案。

defaultdict是如何完成的。

雖然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's answer 這樣的dict ,但不必使用collections.defaultdict

使用字典理解(僅適用於 Python 3+,可能還有 Python 2.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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM