如何在索引上使用模运算?

时间:2015-07-12 10:21:37

标签: python list indexing

我正在尝试创建一个函数,对于列表的每个成员,它返回该成员的值以及它的任何一侧的值的数量。唯一的诀窍是它必须"环绕"当它在列表的开头或结尾时

例如:

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]

但是我无法解决如何处理它的问题。

5 个答案:

答案 0 :(得分: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 :(得分: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

不确定它是如何在内部完成的。

答案 2 :(得分: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集合对象。

答案 3 :(得分:1)

使用(未移位)数组的numpy元素模数生成列表。

你想要包含10个元素的5个元素,所以使用modulo 10.例如,如果列表以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

答案 4 :(得分:-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)

我没有切割清单以使逻辑更清晰 我希望这有效