在 Python 中,如何将项目移动到列表中的确定索引?
使用列表的
insert
方法:
l = list(...)
l.insert(index, item)
或者,您可以使用切片表示法:
l[index:index] = [item]
如果要将列表中已有的项目移动到指定位置,则必须将其删除并将其插入到新位置:
l.insert(newindex, l.pop(oldindex))
如果你不知道该item的位置,你可能需要先找到索引:
old_index = list1.index(item)
然后移动它:
list1.insert(new_index, list1.pop(old_index))
或者恕我直言,一种更干净的方式:
list1.remove(item)
list1.insert(new_index, item)
一个稍微短一点的解决方案,仅将项目移动到末尾,而不是任何地方:
l += [l.pop(0)]
例如:
>>> l = [1,2,3,4,5]
>>> l += [l.pop(0)]
>>> l
[2, 3, 4, 5, 1]
解决方案很简单,但是你必须知道原始位置的索引和新位置的索引:
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 = [1,2,3,4,5]
>>> [*l, l.pop(0)]
[2, 3, 4, 5, 1]
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
向前(从左到右)交换示例:
>>> abc = [1,2,3,4,5]
>>> abc.insert(0, abc.pop(len(abc)-1))
[5, 1, 2, 3, 4]
递归冒泡排序。其中 n 以 arr[] 的长度开始:
def cursed_bubble(arr,n):
if n <= 1: return
# largest element to end of this slice
arr[n-1:n-1] = [arr.pop(arr[:n].index(max(arr[:n])))]
return cursed_bubble(arr,n-1) # smaller slice