提问人:Aditi Kannan 提问时间:3/25/2023 最后编辑:Aditi Kannan 更新时间:3/25/2023 访问量:86
如何在python中使用itertools按嵌套列表中的最后一个元素进行分组?
How to group by the last element in a nested list using itertools in python?
问:
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]]]
答:
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)
我提供的代码使用列表推导式来生成两个不同的列表。首先是结局,另一个是结局.3
2
评论
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]]]
评论
groupby
需要对输入进行排序(就您的键功能而言)。请参见:stackoverflow.com/questions/773/how-do-i-use-itertools-groupby