2015-07-12 48 views
1

我想創建一個函數,對於列表的每個成員,返回該成員的值和它的任何一側的值的數量。唯一的問題是,它具有「環繞」,當它在列表如何在索引上使用模塊化算術?

例如的開頭或結尾:

a = [0,1,2,3,4,5,6,7,8,9] 
myfunc(a,2) # 2 indicates 2 either side 

[8,9,0,1,2] 
[9,0,1,2,3] 
[0,1,2,3,4] 
... 
... 
[6,7,8,9,0] 
[7,8,9,0,1] 

我可以計算出如何從索引2做,直到7 :

def myfunc(vals, rnge): 
    for i in range(0+rnge, len(vals)-rnge): 
     print vals[i-rnge:i+rnge+1] 

但我不能解決當它需要環繞時如何處理。

回答

-1

這裏是解決方案:

def defunc(vals, start, rnge): 
    n = len(vals) 
    new = [] 

    for i in xrange((start - rnge), (start + rnge)+ 1): 
     new.append(vals[i%n]) 
    return new 

def myfunc(vals, rnge): 
    n = len(vals) 
    for i in range(n): 
     print defunc(vals,i,rnge) 

我不是切片的列表,使邏輯更清晰。
我希望這個作品

+0

謝謝,那正是我需要的!這樣我可以避免重複我的列表 – guskenny83

+0

這是一個新的列表len(vals)* 2 *範圍時間。這是很多操作。 –

+0

是的,但雖然我可能不會使用整段代碼,但我可以使用defunc()中的循環來創建索引列表,以便我可以返回原始功能。 – guskenny83

2

你可以試試這個(首先在兩個方向上延伸vals)。有可能是一些在collections,允許這是更有效的進行:

def myfunc(vals, rnge): 
    vals_ext = vals[-rnge:] + vals + vals[:rnge] 
    for i in range(len(vals)): 
     print(vals_ext[i:i+2*rnge+1]) 

輸出:

[8, 9, 0, 1, 2] 
[9, 0, 1, 2, 3] 
[0, 1, 2, 3, 4] 
[1, 2, 3, 4, 5] 
[2, 3, 4, 5, 6] 
[3, 4, 5, 6, 7] 
[4, 5, 6, 7, 8] 
[5, 6, 7, 8, 9] 
[6, 7, 8, 9, 0] 
[7, 8, 9, 0, 1] 
1

如何:

def myfunc(vals, rnge): 
    valsX3 = vals*3; 
    for i in range(len(vals)): 
     print valsX3[i:i+2*rnge+1] 

你可以使用這樣的事情,以避免陣列的重複: wrapping around slices in Python/numpy

雖然不知道它是如何做到的。

+0

這與上面的答案類似,你在任何一方擴展列表。是否沒有計算索引的方法?如果我有非常長的值數組,或者如果列表包含非常大和複雜的對象,那麼我會想象這樣做會是非常低效的。 – guskenny83

+0

你可以做它作爲單獨的操作。或者使用這個: –

1

這是一種替代方法,你可能會發現有用:

def myfunc(alist, offset): 
    adeque = collections.deque(a)  
    adeque.rotate(offset) 
    for i in xrange(len(alist)): 
     print list(itertools.islice(adeque, 0, 2*offset+1)) 
     adeque.rotate(-1) 

a = [0,1,2,3,4,5,6,7,8,9] 
myfunc(a,2) # 2 indicates 2 either side 

它利用deque收藏的對象,它具有高效的rotate功能。

1

使用numpy元素模(非移位)數組生成您的列表。

你想要一個環繞10,所以使用模10.例如5元,如果名單開始的8:

np.mod(np.arange(8,8+5,1),10) returns [8, 9, 0, 1, 2] 

要獲得所有10名可能的名單,評價list(np.mod(np.arange(s,s+5,1),10))每個啓動s=1,2,..,10