如何在python中使用itertools按嵌套列表中的最后一个元素进行分组?

How to group by the last element in a nested list using itertools in python?

提问人:Aditi Kannan 提问时间:3/25/2023 最后编辑:Aditi Kannan 更新时间:3/25/2023 访问量:86

问:

l=[[15.0, 10265.0, 1860.0, 142600.0, 3],[12.0, 14631.0, 3298.0, 153100.0, 2],[22.0, 1707.0, 296.0, 126600.0, 3],[7.0, 1737.0, 290.0, 147000.0, 2]]


如果我想得到两个列表:

[[15.0, 10265.0, 1860.0, 142600.0, 3],[22.0, 1707.0, 296.0, 126600.0, 3]] [[12.0, 14631.0, 3298.0, 153100.0, 2],[7.0, 1737.0, 290.0, 147000.0, 2]]

如何使用 IterTools 执行此操作?还有其他方法可以做到这一点吗?

l1=[]
key_func = lambda x: x[-1]
for key, group in itertools.groupby(l, key_func):
     l1.append(list(group))

我试过了这个,但我得到了 [[[15.0, 10265.0, 1860.0, 142600.0, 3]], [[12.0, 14631.0, 3298.0, 153100.0, 2]], [[22.0, 1707.0, 296.0, 126600.0, 3]], [[7.0, 1737.0, 290.0, 147000.0, 2]]]

python-3.x 列表 嵌套的 python-itertools

评论

0赞 slothrop 3/25/2023
groupby需要对输入进行排序(就您的键功能而言)。请参见:stackoverflow.com/questions/773/how-do-i-use-itertools-groupby

答:

0赞 ahmedg 3/25/2023 #1

您甚至可以在不使用的情况下实现您想要的东西:itertools

l = [[15.0, 10265.0, 1860.0, 142600.0, 3], [12.0, 14631.0, 3298.0, 153100.0, 2], [22.0, 1707.0, 296.0, 126600.0, 3], [7.0, 1737.0, 290.0, 147000.0, 2]]

list_with3 = [x for x in l if x[-1] == 3]
list_with2 = [x for x in l if x[-1] == 2]

print(list_with3)
print(list_with2)

我提供的代码使用列表推导式来生成两个不同的列表。首先是结局,另一个是结局.32

评论

1赞 slothrop 3/25/2023
假设每个子列表的最后一个元素可以是 0 到 1000 之间的任意数字。您将如何为此调整代码?
1赞 gog 3/25/2023 #2

groupby仅当输入按分组键排序时才有效,否则简单的字典就可以了:

groups = {}

for item in YOUR_LIST:
    groups.setdefault(item[-1], []).append(item)

grouped = list(groups.values())
0赞 Alain T. 3/25/2023 #3

您需要对该分组键上的列表进行排序,以便 grouby 按预期工作:

l=[[15.0, 10265.0, 1860.0, 142600.0, 3],[12.0, 14631.0, 3298.0, 153100.0, 2],
   [22.0, 1707.0, 296.0, 126600.0, 3],[7.0, 1737.0, 290.0, 147000.0, 2]]

from itertools import groupby
key_func = lambda x: x[-1]
l1 = [g for _,(*g,) in groupby(sorted(l,key=key_func),key_func) ]

print(l1)
[[[12.0, 14631.0, 3298.0, 153100.0, 2], [7.0, 1737.0, 290.0, 147000.0, 2]],
 [[15.0, 10265.0, 1860.0, 142600.0, 3], [22.0, 1707.0, 296.0, 126600.0, 3]]]

如果你不想对列表进行排序,你可以使用字典来形成组,并在最后将其值()转换为列表:

g = dict()
g.update( (s[-1],g.get(s[-1],[])+[s]) for s in l )
l1 = list(g.values())

print(l1)
[[[15.0, 10265.0, 1860.0, 142600.0, 3], [22.0, 1707.0, 296.0, 126600.0, 3]], 
 [[12.0, 14631.0, 3298.0, 153100.0, 2], [7.0, 1737.0, 290.0, 147000.0, 2]]]