【问题标题】:Optimise a loop that modifies a list [duplicate]优化修改列表的循环[重复]
【发布时间】:2025-12-15 03:30:02
【问题描述】:

我有这段代码可以根据条件修改列表:

lst = [0, 0, 0, 2, 1]

for i, x in enumerate(reversed(lst)):
    if x == 0:
        lst[-i-1] = 9
        break

有没有一种方法可以让我以更好、更优化的方式做到这一点,而无需使用 while 循环?

【问题讨论】:

  • 你必须使用列表吗?或者你可以使用一个numpy数组吗?
  • @alwaysmvp45。只有一个列表。
  • 列表是否仅在开头包含一系列 0,或者它们可以出现在列表中的任何位置?
  • @Nick:列表确实总是以 0 序列开头。唯一的非零元素在末尾。基本上我需要用 9 替换第一个 0(从末尾数)。
  • 这个问题确实是重复的,如果它只是在寻找满足序列中某个标准的最后一个项目 - 请注意,您的原始解决方案比答案中提出的任何一个解决方案都要快。

标签: python list loops


【解决方案1】:

如果列表以0的序列开头,并且其中没有其他0,则可以使用list.count查找最后0的位置(它将比列表中0的计数少一个) 并将其替换为 9:

lst = [0, 0, 0, 2, 1]

lst[lst.count(0)-1] = 9
print(lst)

输出:

[0, 0, 9, 2, 1]

【讨论】:

  • 这只有在输入列表总是以零开头时才有效 - 如果起始列表是 lst = [1, 0, 0, 2, 1] 会发生什么?
  • @Grismar 我问了cmets中OP的具体问题,他们说唯一的非零元素在最后。
  • 啊,你是对的 - 在这种情况下,解决方案工作得很好;更喜欢从结尾或开头看的方法将仅取决于零的数量与列表的其余部分。
  • @Grismar 是的,这有搜索整个列表的惩罚,但它不需要反转它。而当只有一个零时,两种方法都必须搜索整个列表。
  • @Nick 感谢您的回答。考虑到 Grismar 的注释,我原以为您的解决方案会比我自己的解决方案更快,因为我从列表末尾开始循环遍历每个元素。 .count() 比循环慢吗?
【解决方案2】:

看来您只想修改起始lst,方法是将末尾的第一个元素0 替换为9

这个怎么样:

lst = [0, 0, 0, 2, 1]
lst[-(list(reversed(lst)).index(0)+1)] = 9

遗憾的是,您需要其中的list() 才能拥有.index(),因为reversed()list_reverseiterator)的结果没有该方法。

或者,如果您只想简洁:

lst[-lst[::-1].index(0)-1] = 9

我不认为这有助于提高可读性。 (编辑:删除了最初的-1::-1,第一个-1 是多余的,正如@Nick 正确指出的那样)

【讨论】:

  • 你不需要[-1::-1]中的第一个-1