如何在Python中将列表中的元素移动到末尾?

28

我有一个字符串列表称为“values”,我想让列表中的一个元素成为最后一个元素。例如,如果我有字符串:

['string1', 'string2', 'string3']

我想要string2成为最后一个元素:

['string1', 'string3', 'string2']

当我的列表中没有string2时,也可能会出现这种情况。有什么简单的方法可以解决这个问题吗?以下是我目前的解决方案:

if 'string2' in values:
    for i in values:
        #remove string2 and append to end

如果有多个“string2”怎么办?还是你在谈论第二个索引? - squiguy
只有一个字符串2,但我的列表比我提供的小例子要大得多。所以我不知道确切的索引。 - DannyD
你关心最后一个值所在的元素会发生什么吗?它可以随意移动到列表中的其他位置吗?还是你需要它现在成为倒数第二个值? - Travis Griggs
只要最后一个元素可以放在任何位置,其余顺序无关紧要。 - DannyD
6个回答

52
>>> lst = ['string1', 'string2', 'string3']
>>> lst.append(lst.pop(lst.index('string2')))
>>> lst
['string1', 'string3', 'string2']
我们寻找'string2'的索引,将该索引从列表中弹出,然后将其附加到列表中。
也许更加不容易出现异常的方法是首先将要寻找的元素添加到列表末尾(毕竟,您已经预知道它是什么)。然后从列表中删除该字符串的第一个实例:
>>> lst = ['string1', 'string2', 'string3']
>>> lst.append('string2')
>>> del lst[lst.index('string2')]  # Equivalent to lst.remove('string2')
>>> lst
['string1', 'string3', 'string2']

尽管第一种方法更符合Python的风格,但我发现第二种方法更易读。 - Mustapha-Belkacim

22

sort在这个操作中的时间复杂度是O(n),因此与另一个答案没有2或3函数查找相同的时间复杂度。如果列表中没有'string2',则不会出现错误。

>>> lst = ['string1', 'string2', 'string3']
>>> lst.sort(key='string2'.__eq__)
>>> lst
['string1', 'string3', 'string2']

你可以使用相同的技巧将所有的 "string2" 移动到列表的末尾。或者更普遍地,移动整个类别,例如将以 string 开头的所有内容移动到列表末尾:

lst.sort(key=lambda s:s.startswith('string'))
† Timsort 将其视为最多 3 个“runs”,而 timsort 是一种稳定排序算法。

10
lst = ['string1', 'string2', 'string3']
lst.append('string2')
lst.remove('string2')     # -> ['string1', 'string3', 'string2']

(mgilson提出了一个很好的观点 - 如果您先将值添加到列表中,那么始终会有一个要删除的值)


删除操作是否总是删除它找到的第一个? - DannyD
1
@RDoolabh -- 是的。请参阅文档。"从值为x的列表中删除第一个项目。如果没有这样的项目,则会出现错误。" - mgilson
看起来真的很丑陋。难道没有更简单的方法吗? - Claudiu Creanga

0

这里有一种更简单的方法,可以返回新列表:

movetolast = lambda l, e: [x for x in l if x != e] + [e]

lst = [1, 2, 3, 4, 5]
movetolast(lst, 2)

0

根据您的澄清,您只想将选择的项目推到末尾,而不关心倒数第二个项目最终在哪里,我认为最快的方法是找到您候选值的索引,并将其与末尾值交换。这样避免了从 remove() 移动内存的麻烦。我没有计时,但对于大型列表,它会更快(另一方面,如果对您来说足够快,您就不应该在意)。

def pushToEnd(sequence, toBeLast):
    try:
        swapIndex = sequence.index(toBeLast)
    except ValueError:
        return
    sequence[-1], sequence[swapIndex] = sequence[swapIndex], sequence[-1]

fastCars = ['ferarri', 'porsche', 'bugatti', 'lamborghini', 'zonda', 'koenigsegg', 'mcclaren']
pushToEnd(fastCars, 'bugatti')
print(fastCars)

0
#move nth element to last
def movetolast(s, n):
    last = s.index(n)
    s[-1], s[last] = s[last], s[-1]
    return s
print(movetolast([2,3,4,6,7],3)) #[2, 7, 4, 6, 3]
print(movetolast(['apple','cherry','kiwi','mango'],'apple')) #['mango', 'cherry', 'kiwi', 'apple']

2
虽然这段代码可能解决了问题,但是包括解释它如何以及为什么解决了问题将有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加解释并指出适用的限制和假设。 - Dharman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接