2013-11-25 21 views
0

在Python 2.7中,我有一个名为data的列表,其中有一些元组,由第一个属性索引。Python按顺序访问切片的片段

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

这是不清楚你在这里试图达到什么。你的意思是你想要在每个元组中的每个元组上调用'f()',它们被分组到每个元组的第一个元素上? –

+0

如果您的数据按第一个属性进行索引,那么您如何区分As,Bs或Cs? –

+0

'data [x] [0]!= data [x] [ - 1]'在'data'中总是成立。这意味着你基本上在'data'中创建了大小为2的滑动窗口。 –

回答

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()然后给你iterables每个组基于那个价值。循环遍历每个单独的g结果会给你一个只有'A',然后'B'等元组的序列。