提问人:Talal Ghannam 提问时间:5/2/2023 最后编辑:Nathaniel FordTalal Ghannam 更新时间:5/3/2023 访问量:108
循环列表索引
cycling around a list indices
问:
我有一个整数列表,并指定了一个数字。我需要编写一个函数,使它接受 的第一个元素,其索引是 ,添加后续元素,直到 (在我们的例子中为 ,所以 , ),并将其作为另一个列表的第一个元素返回,并对后续元素执行相同的操作。诀窍是,我们需要在 when or are 中循环列表。L = [1, 2, 3, 4, 5]
x
L
0
x
j+1
j+2
R
j+1
j+x
> len(L)
例如;
R = [5 (2+3), 7 (3+4), 9 (4+5), 6 (5+1), 3 (1+2)]
当 ,比如说,我们向后走而不是向前走。所以.x < 0
-2
j-1
j-x
我为 x>0 编写了以下代码,但是我在索引方面遇到了问题。
def decode(L, x):
R = []
if x > 0:
for j in L:
i1 = L.index(j)+1-len(L)
i2 = L.index(j)+x-len(L)
R[L.index(j)] = sum(L[i1:i2])+L[i2]
return R
当 is negative 和 is or positive 时,就会发生问题,这将返回一个空列表。i1
i2
0
答:
您可以使用 itertools 函数来遍历值,而不必为索引而烦恼。该函数将自动为您环绕列表元素。该函数允许您从特定偏移量 (x) 进行迭代。该函数可以随时构建总计,从而避免了添加列表下标的需要(即从累积总和之间的差异中工作):cycle
islice
accumulate
from itertools import accumulate,cycle,islice,tee
def decode(L,x):
S1,S2 = tee(accumulate(cycle(L)),2) # cumulative sums
S2 = islice(S2,x,None) # offset end from start
return [e-s for _,s,e in zip(L,S1,S2)] # sub-sums are differences
L = [1,2,3,4,5]
print(decode(L,2))
[5, 7, 9, 6, 3]
print(decode(L,3))
[9, 12, 10, 8, 6]
对于 x = 2,S1 和 S2 将通过 zip() 组合,以匹配开始 (s) 和结束 (n) 累积值,其差值对应于两者之间的数字之和:
L : 1, 2, 3, 4, 5
S1 (s): 1, 3, 6, 10, 15, ...
S2 (e): 1, 3, 6, 10, 15, 16, 18, ...
e-s : ..... 5, 7, 9, 6, 3
^
first 2 of S2 skipped by islice()
注意:对于 x 的负值,您可以反转列表或将 len(L
) 添加到小岛的偏移量中,具体取决于您期望输出的顺序(即它是以相反的顺序还是简单地添加前面的数字而不是后面的数字)
[编辑]为了在没有库的情况下执行此操作,您可以构建一个实际的累积值列表,并在该累积列表的下标上使用相同的方法,该累积列表的偏移量为 x 个位置:
def decode(L,x):
S = L[:1]
S.extend(S[-1]+n for n in L[1:] + L) # cumulative sums
return [e-s for _,s,e in zip(L,S,S[x:])] # offset differences
为了涵盖 x 的所有可能值,直到列表的长度,您需要累积总和的长度是输入列表的两倍
如果您不介意多次添加相同的项目来获得总和,您可以简单地将列表加倍并在子范围内使用正索引。重复的内容将具有与环绕相同的效果:
def decode(L,x):
if x<0: return decode(L[::-1],-x)[::-1]
return [ sum((L*2)[i+1:i+1+x]) for i in range(len(L))]
我添加了负 x 过程作为如何使用相同(正)逻辑管理它的示例
评论
itertools
我只是想出答案......感谢斯科特·亨特的提示。
def decode(L, x):
R = []
if x > 0:
for j in L:
Long = L+L
i1 = L.index(j)+1
i2 = L.index(j)+x+1
R.append(sum(Long[i1:i2]))
elif x < 0:
for j in L:
x = np.abs(x)
Long = L+L
Long = Long[::-1]
i1 = L.index(j)+1
i2 = L.index(j)+x+1
R.append(sum(Long[i1:i2]))
R = R[::-1]
return R
评论
decode(L,3)