在列表中移动项目?


Answers:


160

使用insert列表的方法:

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

另外,您可以使用切片符号:

l[index:index] = [item]

如果要将列表中已经存在的项目移动到指定位置,则必须将其删除并将其插入新位置:

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

22
请记住,使用插入/弹出方法移动列表中已有的项目将具有不同的行为,具体取决于您是朝列表的前面还是后面移动。向左移动,在您选择的对象之前插入。移至后面,在您选择的项目之后插入。检查是否移至列表末尾(索引错误)。
姆卡拉斯

如何移动多个元素?给定一个列表a = [1,2,3,4,5,6,7,8,9],如何将其转换为[1,2,[3,4,5],6,7,8,9 ]?可以一步一步完成,还是可以通过列表理解来完成?
g33kz0r 2013年

@MKaras我使用Python 3.5对此进行了测试,您可以正确插入其中last index + 1。在这种情况下,该元素只是追加到列表中。
user2061057 '16

@ user2061057是正确的:)即使较大的索引也会导致在最后插入内容。 a.insert(99999, 1) In [14]: a Out[14]: [...., 1]
李·彭克曼

1
对于那些尝试使用索引-1在末尾插入项目的用户,必须使用len(l)代替。
nda

31

稍微短一点的解决方案,它只将项目移到末尾,而不是在任何地方:

l += [l.pop(0)]

例如:

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

13
您不妨使用l.append(l.pop(0))。它只是稍长一些,但可读性更高。
coredumperror

我如何能够将其重新开始?

19

如果您不知道商品的位置,则可能需要先找到索引:

old_index = list1.index(item)

然后移动它:

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

或恕我直言,更干净的方法:

try:
  list1.remove(item)
  list1.insert(new_index, item)
except ValueError:
  pass

6
我认为我对您的pass陈述感到畏缩是正确的...永远不要隐藏异常-这样的示例中的默认值应该是提供更清晰的错误陈述或打印陈述... raise ValueError(f'Unable to move item to {new_index}')print(f'Moving item to {new_index} failed. List remains unchanged.')。也许pass将是确定的,如果在函数调用try_to_move_item或东西,以便其了解,操作可能静默失败。
flutefreak7 '18年

3

解决方案非常简单,但是您必须知道原始位置的索引和新位置的索引:

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

6
这是一次交换,而不是举动。
juzzlin '16

0

我介绍了一些方法,可以通过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))│
──────────┴────────┘

这里是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]│
┘──────────┴─────────┘

如果仅使用几次,则不会有太大的区别,但是如果您进行繁重的工作(如手动分拣),则选择最快的就很重要。否则,我建议您只阅读您认为最易读的内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.