如何在列表中将元素移动到python中

时间:2013-12-02 04:13:07

标签: python list

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

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

我希望string2成为最后一个元素:

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

当我的列表不包含string2时,可能还有一个实例。是否有捷径可寻?这就是我到目前为止所做的:

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

6 个答案:

答案 0 :(得分:18)

>>> 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']

答案 1 :(得分:6)

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次“跑步”的最大化,而且timsort是一种稳定的排序

答案 2 :(得分:5)

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

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

答案 3 :(得分:0)

鉴于你的澄清,你只想把一个选择项目推到最后,而你不关心前一项最终的结果,我认为最快的方法是找到候选值的索引,并将其与结束值交换。这避免了必须从remove()中移入内存。我还没有计时,但在大名单上,它会更快(OTOH,如果它对你来说足够快,你就不应该在乎)。

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)

答案 4 :(得分: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']

答案 5 :(得分:0)

这是返回新列表的更简单方法:

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

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