我有一个称为值的字符串列表,我想让列表中的一个元素成为最后一个元素。例如,如果我有字符串:
['string1', 'string2', 'string3']
我希望 string2 成为最后一个元素:
['string1', 'string3', 'string2']
也可能存在我的列表不包含 string2 的情况。是否有捷径可寻?这是我到目前为止所拥有的:
if 'string2' in values:
for i in values:
#remove string2 and append to end
>>> 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']
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 是一种稳定排序
lst = ['string1', 'string2', 'string3']
lst.append('string2')
lst.remove('string2') # -> ['string1', 'string3', 'string2']
(mgilson 提出了一个很好的观点 - 如果您首先将值添加到列表中,那么总会有一个要删除)
鉴于您的澄清,您只想将一个选择项推到最后,并且您不关心最后一项在哪里结束,我认为最快的事情是找到候选值的索引,然后交换与最终值。这避免了必须将内存从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)
#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']
这是返回新列表的更简单方法:
movetolast = lambda l, e: [x for x in l if x != e] + [e]
lst = [1, 2, 3, 4, 5]
movetolast(lst, 2)
这是@macsunmood 分享的解决方案的延续
如果存在重复的此类元素并且需要将它们全部移动:
movetolast = lambda l, e: [x for x in l if x != e] + [e] * l.count(e)
lst = [1, 2, 3, 4, 5]
移动到最后(lst,2)
这应该可以解决问题。