【问题标题】:How to turn a list into a circular list in Python 3?如何在 Python 3 中将列表变成循环列表?
【发布时间】:2019-05-13 06:29:13
【问题描述】:

我有一个列表 [0,1,0] 并且想遍历它,并查看每个项目的邻居(邻居 = 2 个索引)并更新值(1 更改为 0,反之亦然),如果邻居具有相同的值。当迭代并到达列表中的最后一项时,我想从列表的第 0 个索引处重新开始。所以第一个索引中的项目的邻居实际上是上面示例中第 0 个索引中的项目,列表长度为 3。

我还希望能够确定我遍历列表的次数。

如果它的邻居(2 个索引之外)具有相同的值,我可以更新列表中某个项目的值,但是当我到达最后一个项目时,我遇到了索引超出范围错误的问题列表。为了解决这个问题,我尝试从列表中弹出最后一项并将其附加到开头,这样我就不会脱离数组的末尾,但是我没有得到预期的结果(见下面的结果),我我不确定为什么。

我也尝试过使用itertools 中的cycle,这非常适合迭代,但不适用于访问特定列表中的元素获取列表在某个索引处的值。

弹出和追加的结果如下:

[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]

等等。

【问题讨论】:

  • 您的列表会重复吗,@JohnWachter 的可重复模式是什么?

标签: python python-3.x


【解决方案1】:

您的问题不清楚,但我从您的问题中解释的是,您可能正在寻找以循环方式遍历列表并更新其值。 试试这个

   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);


【讨论】:

  • 您的方法效果很好,据我所知,模数用于将索引 2 保持在当前 i 的值之前,非常棒。我认为您的响应缺少的一件事是一个参数,用于决定我将浏览列表多少次,这很容易添加:thelist = [0,1,0] key=2; p = 0 而 p
  • 谢谢,乐于助人!!但是你确定你理解模数和键的概念吗?如果有任何疑问,请告诉我,我会解决的。
【解决方案2】:

对于您的特定任务,我会按相同顺序保留初始列表并检查索引:

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)

输出:

[1, 1, 0]
[1, 0, 0]
[1, 0, 1]

【讨论】:

  • 谢谢,你的第一个例子正是我想要的。我也尝试过 pop 和 append,但遇到了问题,所以显然我不想要一个真正的循环列表,感谢您帮助澄清这一点。我不清楚使用模函数如何解决索引超出范围错误,请您帮忙详细说明一下吗?
  • 很高兴它有帮助。如果您有兴趣,我更新了我的答案,显示如何使用 pop 和 append 获得相同的结果
猜你喜欢
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 2023-01-09
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
  • 2019-04-29
相关资源
最近更新 更多