如何在Python 3中将列表变成循环列表?

时间:2019-05-13 06:29:14

标签: python python-3.x

我有一个列表[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]

以此类推。

2 个答案:

答案 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)