2015-07-12 47 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