Python 是否将列表中的每个项目都替换为以前的项目?

Python 是否将列表中的每个项目都替换为以前的项目?,python,list,Python,List,比如说, ls = [8, 5, 2, 17] 我想用上一个项目替换每个项目,并为最后一个项目添加新值 预期结果是: ls = [5, 2, 17, new_value] 从时间复杂性的角度来看,达到这一目标的最佳方式是什么 我的实施细节: 我正在一个叫做“鲍鱼”的棋盘游戏中实现AlphaZero算法,我需要处理输入数据 输入数据的示例如下: ls_3d = [ [board_before_2_last_board], [board_before_last_board], [last_boa

比如说,

ls = [8, 5, 2, 17]
我想用上一个项目替换每个项目,并为最后一个项目添加新值

预期结果是:

ls = [5, 2, 17, new_value]
从时间复杂性的角度来看,达到这一目标的最佳方式是什么

我的实施细节:

我正在一个叫做“鲍鱼”的棋盘游戏中实现AlphaZero算法,我需要处理输入数据

输入数据的示例如下:

ls_3d = [
[board_before_2_last_board],
[board_before_last_board],
[last_board],
[current_board]
]
*each board is a 2d array
我每次移动都要处理这个3d列表。为了训练模型,我想我会做很多次,所以我希望它尽可能快

在看到答案后,我认为1d列表中的方法是相同的。像这样:

ls = ls[1:,:,:]+[new_board]
正确吗?

简单:

ls = [8, 5, 2, 17]
ls = ls[1:]+[new_value]

如果您希望就地修改列表(如果您还有其他引用,这可能很重要),则可以执行以下操作:

ls = [8, 5, 2, 17]
ls.pop(0)  # remove first element
ls.append(new_value)  # put new value on the end
追加是快速的,但是从列表开始的pop是O(n)时间复杂度

尽管如此,它比将列表重新分配给新对象(即任何启动
ls=…
的对象)要快

在具有1000个大小列表和100000次迭代的计时测试中(这里我使用循环变量
I
作为要附加的新元素):

在我的机器上花了大约0.031秒

一些替代方案,包括重新分配清单:

for i in range(100000):
    ls = ls[1:]
    ls.append(i)
用了0.221秒

最慢的是:

for i in range(100000):
    ls = ls[1:] + [i]
用了0.433秒


在最后一个迭代中,每次迭代都要构造一个大小为n-1的新临时列表,然后构造一个大小为n的列表,这就是为什么要花费上一个列表的两倍时间(构造一个大小为n-1的列表,然后添加一个元素)。

您当前的实现是什么,有什么问题吗?等等,我将为您更新详细的实现:)@jornsharpe Updated。你可以检查一下。这能回答你的问题吗?对不起,我是python的初学者,所以我问了一个像这样愚蠢的问题。你的答案看起来不错:)我会尝试弹出和附加。看起来很有帮助@HLM从一个列表的开头弹出仍然不是很好。真正快得多的方法是根本不这样做,而只是重新分配一个元素(例如,
ls[i%n]=new_value
,其中
i
是当前的迭代次数,
n
是列表的长度,
%
表示模),然后,当您要为其编制索引时,您必须向索引中添加一个偏移量以允许此操作-这有意义吗?@HLM基本上是指您刚刚在位置
索引
(=
i%n
)而不是在列表的末尾进行分配,然后您需要查找
j
第个元素,然后查找元素
(index+j)%n
,因此获取所需的项目稍微复杂一些,但最大的好处是您不必移动所有值(这是pop必须做的),每次只需继续写入不同的位置即可(当到达终点时,返回位置0并再次循环)。
for i in range(100000):
    ls = ls[1:] + [i]