我有一个列表[0,1,0],想遍历该列表,并查看每个项目的邻居(neighbor = 2个索引)并更新值(1变为0,反之亦然)邻居具有相同的值。当遍历并到达列表的最后一项时,我想从列表的第0个索引开始。因此,在上面的示例中,第一个索引中的项的邻居实际上是第0个索引中的项,其长度为3。
我还希望能够确定在列表上进行迭代的次数。
如果它的邻居(距离2个索引)具有相同的值,我就可以更新列表中的一个值,但是当我到达列表中的最后一个项目时,我遇到了索引超出范围错误的麻烦清单。为了解决这个问题,我尝试从列表中弹出最后一项并将其追加到开头,这样我就不会掉到数组的末尾,但是我没有得到预期的结果(请参见下面的结果),并且不确定原因。
我还尝试过使用cycle
中的itertools
,这非常适合进行迭代,但不适用于访问特定列表中的元素以获取特定索引处的列表值。
弹出和附加的结果如下:
[0, 1, 0]
[1, 0, 1]
[0, 1, 0]
[1, 0, 1]
[0, 1, 0]
[1, 0, 1]
我希望结果如下:
original list = [0,1,0]
after 1 time step | [1,1,0]
after 2 time steps | [1,0,0]
after 3 time steps | [1,0,1]
以此类推。
答案 0 :(得分:0)
您的问题尚不清楚,但我从您的问题中得出的解释是,您可能正在寻找以循环方式遍历列表并更新其值的方法。 试试看
list = [0,1,0]
key=2;
for i in range(len(list)):
index = (i+key)%len(list);
if list[i] == list[index]:
list[i] = int(not list[i]);
print(list);
答案 1 :(得分:0)
对于您的特定任务,我会以相同的顺序保留初始列表并检查索引:
LEFT JOIN
同时,为了使列表为圆形,我宁愿将第一个索引附加到最后一个索引上:
l = [0, 1, 0]
n = 0
while n < 1: # choose number of iterations
for i in range(len(l)):
l[i] = (l[i], int(not l[i]))[l[i] == l[(i+2)%len(l)]] # invert when equal to its neighbor
print(l)
n += 1
# [1, 1, 0]
# [1, 0, 0]
# [1, 0, 1]
您还可以通过弹出和追加来获得相同的结果,但是您必须在每一步都根据原始列表对索引进行排序:
l = [1, 2, 3]
for _ in range(7):
print(l)
f = l.pop(0)
l.append(f)
#[1, 2, 3]
#[2, 3, 1]
#[3, 1, 2]
#[1, 2, 3]
#[2, 3, 1]
#[3, 1, 2]
#[1, 2, 3]
输出:
for i, _ in enumerate(range(3)):
l[0] = int(not(l[0])) if l[0] == l[2] else l[0]
ind = (len(l) - i)%len(l) # get actual position of first element
original = l[ind:] + l[:ind] # here we start from index 0
print(l[ind:] + l[:ind])
f = l.pop(0)
l.append(f)