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]