Python按顺序访问列表的切片

时间:2013-11-25 16:59:00

标签: python list python-2.7 slice

在Python 2.7中,我有一个名为data的列表,带有一些元组,由第一个属性索引,例如

data = [('A', 1, 2, 3), ('A', 10, 20, 30), ('A', 100, 200, 300),
        ('B', 1, 2, 3), ('B', 10, 20, 30),
        ('C', 15, 25, 30), ('C', 1, 20, 22), ('C', 100, 3, 8)]

有一个函数f()可以在第一个索引匹配的data切片上工作,例如

f( [x[1:] for x in data[:3] )

我想在数组的每个切片(具有相同第一个索引的元组组)上调用f(按正确顺序),并在列表中编译结果值列表。

我刚开始使用Python。这是我的解决方案,是否有更好(更快或更优雅)的方式来做到这一点?

slices = [x for x in xrange(len(data)) if data[x][0] != data[x-1][0]]
result = [f(data[start:end] for start, end in zip( [slices[:-1], slices[1:] )]

谢谢。

1 个答案:

答案 0 :(得分:2)

如果要对每个元组的第一项进行分组,可以使用itertools.groupby()进行分组:

from itertools import groupby
from operator import itemgetter

[f(list(g)) for k, g in groupby(data, key=itemgetter(0))]

itemgetter(0)返回每个元组的第一个元素,groupby()然后根据该值为每个组提供迭代。循环遍历每个g个结果,然后会为您提供一系列仅包含'A',然后是'B'等的元组。