如何通过第一个元素对列表内的列表进行分组?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过第一个元素对列表内的列表进行分组?相关的知识,希望对你有一定的参考价值。
我有一个看起来像这样的列表列表:
big_list = [[0,5,70],[0,3,50],[0,4,60],[0,6,30],
[1,6,50],[1,4,30],[1,3,70],
[2,4,20],[2,5,40],
[69,420,20]]
我如何将其变成此列表,其中所有列表均按每个列表中的第一个数字分组为列表:
big_list_sorted = [[[0,3,20],[0,5,70],[0,4,60],[0,6,30]],
[[1,6,50],[1,4,20],[1,3,70]],
[[2,4,30],[2,5,40]],
[[69,420,20]]]
此外,在这里,为了便于阅读,我将列表放在原始的list_big中,但它们并不是按顺序排列的。
答案
您可以使用itertools.groupby
>>> from itertools import groupby
>>> [list(g) for _, g in groupby(big_list, lambda l: l[0])]
[[[0, 5, 70], [0, 3, 50], [0, 4, 60], [0, 6, 30]], [[1, 6, 50], [1, 4, 30], [1, 3, 70]], [[2, 4, 20], [2, 5, 40]], [[69, 420, 20]]]
注意:您可以无效地使用list
,它只是为了使输出更可读,因为groupby返回了迭代器。
另一答案
您可以使用itertools.groupby
完成此操作。
首先,您按第一个元素对数组进行排序。
itertools.groupby
接下来,您应用big_list = sorted(big_list)
将它们分成键在第一个元素上的子数组。
groupby
至此,您看起来像
itertools.groupby(big_list, key=lambda x:x[0])
在元组中,索引1的分组对象包含与索引0的键匹配的元素。现在,您可以使用每个元组的索引1创建一个数组。
[(0, <itertools._grouper object at 0x107bcf390>), (1, <itertools._grouper object at 0x107bcf310>), (2, <itertools._grouper object at 0x107bcf250>), (69, <itertools._grouper object at 0x107bcf2d0>)]
另一答案
您可以将[list(g) for i, g in itertools.groupby(big_list, lambda x: x[0])]
中的列表按其第一个元素分组,并使用dictionary获得结果:
.values()
另一答案
您可以使用.values()
。
将(内部)列表(通过groupby)分组,在其[
groups = {}
for l in big_list:
groups.setdefault(l[0], []).append(l)
big_list_sorted = list(groups.values())
print(big_list_sorted)
# [[[0, 5, 70], [0, 3, 50], [0, 4, 60], [0, 6, 30]], [[1, 6, 50], [1, 4, 30], [1, 3, 70]], [[2, 4, 20], [2, 5, 40]], [[69, 420, 20]]]
作为旁注(可能是),所需输出([Python 3.Docs]: itertools - Functions creating iterators for efficient looping)中的1 元素未出现在输入中。 您需要基于每个列表的第一个元素进行自定义排序。
另一答案
None以上是关于如何通过第一个元素对列表内的列表进行分组?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 python itertools.groupby() 按字符串的第一个字符对字符串列表进行分组?