在列表的所有可能位置插入值

40 投票
7 回答
104921 浏览
提问于 2025-04-15 19:00

我想要打印出一个给定列表的所有可能结果,想知道怎么把一个值放到列表的不同位置。比如说,如果我的列表是 [A, B],我想把 X 插入到列表的所有可能位置,这样就能得到 [X, A, B][A, X, B][A, B, X] 这些结果。

我在考虑用 range(len()) 和一个循环来实现,但不知道该怎么开始。

7 个回答

5

如果你想把一个列表放进另一个列表里,可以这样做:

>>> a = [1,2,3,4,5]
>>> for x in reversed(['a','b','c']): a.insert(2,x)
>>> a
[1, 2, 'a', 'b', 'c', 3, 4, 5]
95

使用 insert() 方法可以在指定位置之前插入一个元素。

比如,假设有

arr = ['A','B','C']
arr.insert(0,'D')

那么数组变成了 ['D','A','B','C'],因为 D 被插入到了索引为 0 的位置之前。

接下来,对于

arr = ['A','B','C']
arr.insert(4,'D')

数组变成了 ['A','B','C','D'],因为 D 被插入到了索引为 4 的位置之前(这个位置在数组的末尾之后)。

不过,如果你想生成一个数组的所有排列,Python 已经有现成的方法可以做到。它的 itertools 包里有一个排列生成器。

下面是一些示例代码:

import itertools
arr = ['A','B','C']
perms = itertools.permutations(arr)
for perm in perms:
    print perm

这段代码会输出

('A', 'B', 'C')
('A', 'C', 'B')
('B', 'A', 'C')
('B', 'C', 'A')
('C', 'A', 'B')
('C', 'B', 'A')
22

你可以用下面这种方式来实现:

[mylist[i:] + [newelement] + mylist[:i] for i in xrange(len(mylist),-1,-1)]

用你的例子来说:

>>> mylist=['A','B']
>>> newelement='X'
>>> [mylist[i:] + [newelement] + mylist[:i] for i in xrange(len(mylist),-1,-1)]
[['X', 'A', 'B'], ['B', 'X', 'A'], ['A', 'B', 'X']]

撰写回答