如何通过Python中的第一个元素对元组列表进行重新分类?

2024-07-04 14:11:52 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Python3.x,我有一个元组列表,如下所示(其中第一个元素是整数或字符串):

tuple_list = [(1, 'AA', 515), (1, 'BBT', 101), 
                  (1, 'CZF', 20), (2, 'TYZ', 8341), (2, 'ONR', 11)]

在本例中,一些元组以1开头,另一些元组以2开头。每一个都被放在一个单独的列表中

我想用一种方法将第一个元素相同的元组“分类”到单独的列表中

在这种情况下,理想的解决方案是以下列表:

[[(1, 'AA', 515), (1, 'BBT', 101), (1, 'CZF', 20)], 
        [(2, 'TYZ', 8341), (2, 'ONR', 11)]]

这可以通过迭代和检查每个(唯一的)第一个元素是否存在一个列表来实现,但是对于具有比简单的12更“唯一”的第一个元素的较大列表,这在计算上是昂贵的

如何做到快速/高效


Tags: 方法字符串元素列表整数python3listaa
2条回答

一种方法是使用defaultdict并将第一个元素存储为索引,然后将它们分组,如下所示:

from collections import defaultdict

tuple_list = [(1, 'AA', 515), (1, 'BBT', 101),
                  (1, 'CZF', 20), (2, 'TYZ', 8341), (2, 'ONR', 11)]

dct = defaultdict(list)
for l in tuple_list:
    dct[l[0]].append(l)

print(sorted(dct.values(), key=lambda l: l[0][0]))

>>> [[(1, 'AA', 515), (1, 'BBT', 101), (1, 'CZF', 20)], [(2, 'TYZ', 8341), (2, 'ONR', 11)]]

使用^{}。与^{}配对以实现高效的查找/切片

from itertools import groupby
from operator import itemgetter

tuple_list = [(1, 'AA', 515), (1, 'BBT', 101), (1, 'CZF', 20), (2, 'TYZ', 8341), (2, 'ONR', 11)]

get_first = itemgetter(0)
result = [list(g) for k, g in groupby(sorted(tuple_list, key=get_first), get_first)]

结果:

[[(1, 'AA', 515), (1, 'BBT', 101), (1, 'CZF', 20)], [(2, 'TYZ', 8341), (2, 'ONR', 11)]]

或使用^{}

from collections import defaultdict

d = defaultdict(list)

for t in tuple_list:
    d[t[0]].append(t)

result = list(d.values())

结果:

[[(1, 'AA', 515), (1, 'BBT', 101), (1, 'CZF', 20)], [(2, 'TYZ', 8341), (2, 'ONR', 11)]]

相关问题 更多 >

    热门问题