我正在尝试创建一个函数,对于列表的每个成员,它返回该成员的值以及它的任何一侧的值的数量。唯一的诀窍是它必须"环绕"当它在列表的开头或结尾时
例如:
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]
但是我无法解决如何处理它的问题。
答案 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)
我没有切割清单以使逻辑更清晰 我希望这有效