如何通过第一个元素对列表内的列表进行分组?

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)分组,在其[初始列表的1 st元素上:

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

以上是关于如何通过第一个元素对列表内的列表进行分组?的主要内容,如果未能解决你的问题,请参考以下文章

如何从片段内的列表视图打开链接网址?

按列表列中的元素对 Pandas 数据框进行分组

如何使用 python itertools.groupby() 按字符串的第一个字符对字符串列表进行分组?

如何根据某些文本标准对元组列表进行分组/存储?

我有一个带有列表的熊猫列。对包含来自同一列的至少一个公共元素的行进行分组

Python代码阅读(第40篇):通过两个列表生成字典