2013-11-25 27 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'等元組的序列。