我有一个名为values的字符串列表,我想让列表中的元素成为最后一个元素.例如,如果我有字符串:
['string1', 'string2', 'string3']
Run Code Online (Sandbox Code Playgroud)
我希望string2成为最后一个元素:
['string1', 'string3', 'string2']
Run Code Online (Sandbox Code Playgroud)
当我的列表不包含string2时,也可能有一个实例.是否有捷径可寻?这是我到目前为止:
if 'string2' in values:
for i in values:
#remove string2 and append to end
Run Code Online (Sandbox Code Playgroud)
mgi*_*son 20
>>> lst = ['string1', 'string2', 'string3']
>>> lst.append(lst.pop(lst.index('string2')))
>>> lst
['string1', 'string3', 'string2']
Run Code Online (Sandbox Code Playgroud)
我们查找'string2'索引,从列表中弹出该索引,然后将其附加到列表中.
或许更为例外的免费方式是首先将您正在寻找的东西添加到列表的末尾(毕竟,您已经知道它是什么).然后从列表中删除该字符串的第一个实例:
>>> lst = ['string1', 'string2', 'string3']
>>> lst.append('string2')
>>> del lst[lst.index('string2')] # Equivalent to lst.remove('string2')
>>> lst
['string1', 'string3', 'string2']
Run Code Online (Sandbox Code Playgroud)
sort对于此操作†是O(n),因此它与没有2或3函数查找的其他答案具有相同的时间复杂度.如果'string2'不在列表中,则没有错误
>>> lst = ['string1', 'string2', 'string3']
>>> lst.sort(key='string2'.__eq__)
>>> lst
['string1', 'string3', 'string2']
Run Code Online (Sandbox Code Playgroud)
您可以使用相同的技巧将所有"string2"移动到列表的末尾.或者更一般地说是整个类别,例如将所有内容从string列表末尾移动到列表的末尾:
lst.sort(key=lambda s:s.startswith('string'))
Run Code Online (Sandbox Code Playgroud)
†Timsort认为这是3"跑步"的最大化,而timsort是稳定的
lst = ['string1', 'string2', 'string3']
lst.append('string2')
lst.remove('string2') # -> ['string1', 'string3', 'string2']
Run Code Online (Sandbox Code Playgroud)
(mgilson提出了一个很好的观点 - 如果你先将值添加到列表中,总会有一个要删除)