【问题标题】:Pushing all elements of a python list one element earlier将python列表的所有元素推前一个元素
【发布时间】:2015-01-10 22:48:50
【问题描述】:

我目前正在制作一个简单的蛇式游戏,它在二维列表(/数组)中移动 我还有一个列表,其中包含蛇的每个部分的坐标。它大部分都在工作,只是数组的第一个和第二个元素总是相同的,我不知道为什么。

我这样做的方法是向后迭代列表并从前一个元素中获取值以应用于当前元素。

即。列表中的最后一个元素被设置为倒数第二个的值。然后倒数第二个设置为倒数第三个等等。

代码如下:

while i < playerLength:
    x = playerSections[-i-1][0]
    y = playerSections[-i-1][1]
    playerSections[-i] = [x,y]
    i+=1

我知道一些简单的解决方法来避免这个问题(例如,让循环更快地终止一次迭代)但我想知道为什么这不起作用,所以如果其他人能发现这个错误,我会更好地理解它。

【问题讨论】:

  • Python 索引的工作原理是从第一个(包括)到最后一个(不包括),即当您选择 a[1:4] 时,它会为您提供 a[1] a[2] 和 a[3].. ...如果这有意义
  • 为什么不直接删除最后一个元素呢?你总是可以在开头插入一个新元素..
  • ...那会简单得多!我一直在使用太多 Java,我忘记了其他语言中的列表有多灵活,所以这会减少最初预期的代码。
  • 我发誓,曾经编码过蛇(用于学习目的)的单身人士都遇到过这个问题,并且总是得到 martjin 的答案。

标签: python arrays list for-loop


【解决方案1】:

您可以简单地删除最后一个元素并在前面添加一个,如下所示:

l = [[1,1],[2,1],[2,2]]
l.pop[-1]
l.insert(0, [0,1])

这将删除最后一个元素并在前面插入一个新元素——索引将被调整。

反过来(删除第一个元素并添加到末尾)的工作方式如下:

l.pop[0]
l.append([2,3])

替代方案:

我刚刚遇到collections.deque,它为您提供了一个链接的双端列表,其中包含用于在任一侧添加或删除元素的专用函数。只要您不对中间元素执行操作,可能会更快,这应该在您的情况下给出。

https://docs.python.org/2/library/collections.html#collections.deque

【讨论】:

  • 如果效率是一个问题(代码复杂一点也可以),你会使用array,将播放器长度作为变量,并批量删除元素(类似于垃圾收集) .也就是说,我同意deque 是一个不错的折衷方案:它避免了 O(n) 删除,但保持代码简单。
【解决方案2】:

Martijn Pieters 提出了一个很好的观点。无需在数组中移动蛇的整个长度,您只需移除蛇的最后一部分并将其移动到前面。

【讨论】:

    猜你喜欢
    • 2017-05-02
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2015-03-27
    • 2019-09-05
    • 1970-01-01
    • 2020-06-22
    • 2021-03-24
    相关资源
    最近更新 更多