在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:] )]
谢谢。
答案 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'
等的元组。