在列表中移动项?

在 Python 中,如何将项目移动到列表中的确定索引?

180845 次浏览

使用列表的 insert方法:

l = list(...)
l.insert(index, item)

或者,您可以使用切片表示法:

l[index:index] = [item]

如果你想把一个已经在列表中的项目移动到指定的位置,你必须删除它并把它插入到新的位置:

l.insert(newindex, l.pop(oldindex))

一个稍微短一点的解决方案,只是把项目移动到最后,而不是移动到任何地方,是这样的:

l += [l.pop(0)]

例如:

>>> l = [1,2,3,4,5]
>>> l += [l.pop(0)]
>>> l
[2, 3, 4, 5, 1]

如果你不知道项目的位置,你可能需要先找到索引:

old_index = list1.index(item)

然后移动它:

list1.insert(new_index, list1.pop(old_index))

或者,恕我直言,一种更干净的方式:

list1.remove(item)
list1.insert(new_index, item)

一个非常简单的解决方案,但你必须知道原始头寸的指数和新头寸的指数:

list1[index1],list1[index2]=list1[index2],list1[index1]

我分析了几种方法,可以用 timeit 移动同一列表中的一个项目。下面是如果 j > i 可以使用的方法:

┌──────────┬──────────────────────┐
│ 14.4usec │ x[i:i]=x.pop(j),     │
│ 14.5usec │ x[i:i]=[x.pop(j)]    │
│ 15.2usec │ x.insert(i,x.pop(j)) │
└──────────┴──────────────────────┘

这里是使用 if j < = i:

┌──────────┬───────────────────────────┐
│ 14.4usec │ x[i:i]=x[j],;del x[j]     │
│ 14.4usec │ x[i:i]=[x[j]];del x[j]    │
│ 15.4usec │ x.insert(i,x[j]);del x[j] │
└──────────┴───────────────────────────┘

如果你只使用它几次,这并没有太大的区别,但是如果你做一些繁重的工作,比如手工分类,那么最快的一次就很重要了。否则,我建议你选择一个你认为最易读的。

l = list(...) #replace ... with the list contents
if item in l: #Checks if the item to be moved is present in the list
l.remove(item) #  Removes the item from the current list if the previous line's conditions are achieved
l.insert(new_index,item) # Adds item to new list

我更喜欢用这样一个表达:

>>> l = [1,2,3,4,5]
>>> [*l, l.pop(0)]
[2, 3, 4, 5, 1]

一个远期(从左到右)互换的例子:

>>> abc = [1,2,3,4,5]
>>> abc.insert(0, abc.pop(len(abc)-1))


[5, 1, 2, 3, 4]