如何从列表中删除一些元素并将它们附加到 Python 中的列表开头

-2 python

假设我有一个列表,其中包含 [0, 1, 2, 3 , 4, 5, 6] 。我想删除那些大于或等于 3 的元素并将这些删除的元素添加到列表的开头。所以我写了下面的代码:

list = [0, 1, 2, 3, 4, 5, 6]
new_list =[]

for number in list:
    if number >= 3:
        dropped_number = list.pop()
        new_list.append(dropped_number)
    new_list.sort()

new_list += list

print(new_list)
Run Code Online (Sandbox Code Playgroud)

但是,当我运行代码时,结果显示为 [5, 6, 0, 1, 2, 3 , 4]。谁能向我解释一下我在这里做错了哪一步?

Ala*_* T. 6

您的代码有两个问题。

  1. 您使用 list.pop() 获得的数字不是您刚刚根据条件检查过的数字(它只是列表中的最后一个)
  • 当你达到 3 时, list.pop() 删除 6,
  • 当你达到 4 时, list.pop() 删除 5,
  • 您永远不会达到 5,因为那时您已处于列表剩余部分的末尾。
  1. 从同一列表上的 for 循环内的列表中删除项目将导致 for 循环跳过项目或抱怨列表在迭代过程中发生了变化。因此,即使您要弹出适当的数字,您的循环也会错过项目。

您也不需要每次添加时都对 new_list 进行排序,您可以在最后进行一次,但这只是优化。

代替 for 循环,您可以使用带有 key 参数的 sort 方法,该方法返回一个布尔值,指示不满足您的条件的元素(即将向右移动)的 True 。因为 Python 的排序是稳定的,这只会将元素放在两个组中,而不会改变它们的相对顺序。

L = [0, 2, 4, 6, 1, 3, 5]
L.sort(key=lambda x: not x>=3)
print(L) # [4, 6, 3, 5, 0, 2, 1]
Run Code Online (Sandbox Code Playgroud)

如果您需要更程序化的解决方案,您可以将两个列表中的值分开,最后粘在一起:

L = [0, 2, 4, 6, 1, 3, 5]
left,right = [], []
for x in L:
    if x >= 3: left.append(x)
    else:      right.append(x)
L = left + right

# [4, 6, 3, 5, 0, 2, 1]
Run Code Online (Sandbox Code Playgroud)