我正在尝试打印给定列表的所有可能结果,我想知道如何将值放入列表中的各个位置。例如,如果我的列表是[A,B]
,我想将X
插入到列表的所有可能索引中,以便它返回此[X,A,B]
,[A,X,B]
,{{1 }}。
我在考虑使用[A,B,X]
和for循环,但不知道如何开始。
答案 0 :(得分:80)
使用insert()在给定位置前插入元素。
例如,
arr = ['A','B','C']
arr.insert(0,'D')
arr变为['D','A','B','C']
因为D
插入到索引0处的元素之前。
现在,
arr = ['A','B','C']
arr.insert(4,'D')
arr变为['A','B','C','D']
,因为D
插入到索引4处的元素之前(超出数组末尾的1)。
但是,如果您希望生成数组的所有排列,那么有很多方法可以在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')
答案 1 :(得分:20)
您可以使用以下列表理解来执行此操作:
[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']]
答案 2 :(得分:4)
如果要将列表插入列表,可以执行以下操作:
>>> 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]
答案 3 :(得分:1)
最简单的是使用列表[i:i]
a = [1,2, 3, 4]
a[2:2] = [10]
打印a以检查插入
print a
[1, 2, 10, 3, 4]
答案 4 :(得分:0)
来自JavaScript,这是我习惯拥有的内置"通过Array.prototype.splice(),所以我创建了一个相同的Python函数:
def list_splice(target, start, delete_count=None, *items):
"""Remove existing elements and/or add new elements to a list.
target the target list (will be changed)
start index of starting position
delete_count number of items to remove (default: len(target) - start)
*items items to insert at start index
Returns a new list of removed items (or an empty list)
"""
if delete_count == None:
delete_count = len(target) - start
# store removed range in a separate list and replace with *items
total = start + delete_count
removed = target[start:total]
target[start:total] = items
return removed
答案 5 :(得分:0)
只是为了好玩,一个解决方案:
O(n * m)
工作(对 list.insert
的幼稚重复调用会执行)奖励,(对于询问 a duplicate question 的人)它使用了 the itertools
module 而不会感到完全被迫:
import itertools
l1 = ['a','b','c','d','f']
l2 = ['Z', 'Y']
combined_indices = range(len(l1)+len(l2))
iterators = itertools.cycle(l1), itertools.cycle(l2)
l3 = []
for positions in map(frozenset, itertools.combinations(combined_indices , len(l2))):
l3.append([next(iterators[idx in positions]) for idx in combined_indices])
print(*l3, sep="\n")
产生以下形式的输出:
['Z', 'Y', 'a', 'b', 'c', 'd', 'f']
['Z', 'a', 'Y', 'b', 'c', 'd', 'f']
['Z', 'a', 'b', 'Y', 'c', 'd', 'f']
['Z', 'a', 'b', 'c', 'Y', 'd', 'f']
['Z', 'a', 'b', 'c', 'd', 'Y', 'f']
['Z', 'a', 'b', 'c', 'd', 'f', 'Y']
['a', 'Z', 'Y', 'b', 'c', 'd', 'f']
['a', 'Z', 'b', 'Y', 'c', 'd', 'f']
# ... eleven lines omitted ...
['a', 'b', 'c', 'd', 'Z', 'f', 'Y']
['a', 'b', 'c', 'd', 'f', 'Z', 'Y']
为了额外的乐趣,一个版本以任意顺序插入 l2
的元素(并将工作浓缩为一个非常复杂的列表组合):
from itertools import cycle, permutations, repeat
l1 = ['a','b','c','d','f']
l2 = ['Z', 'Y']
combined_indices = range(len(l1)+len(l2))
i1next = cycle(l1).__next__
l3 = [[pos_to_l2[pos] if pos in pos_to_l2 else i1next() for pos in combined_indices]
for pos_to_l2 in map(dict, map(zip, permutations(combined_indices, len(l2)), repeat(l2)))]
print(*l3, sep="\n")
行为相同,但产生输出,其中 l2
的元素以任一顺序插入(当 l2[0]
右移时,l2
的其他元素在它们之前插入在它之后继续插入,就像在第一个解决方案中一样,例如输出序列:
...
['Z', 'a', 'b', 'c', 'd', 'f', 'Y']
['a', 'Z', 'Y', 'b', 'c', 'd', 'f']
...
扩展为:
...
['Z', 'a', 'b', 'c', 'd', 'f', 'Y']
['Y', 'Z', 'a', 'b', 'c', 'd', 'f'] # New
['a', 'Z', 'Y', 'b', 'c', 'd', 'f']
...
答案 6 :(得分:-1)
如果l
是您的列表,X
是您的值:
for i in range(len(l) + 1):
print l[:i] + [X] + l[i:]
答案 7 :(得分:-4)
试试这段代码:
for x in range(3):
l=['A', 'B']
l.insert(x, 'X')
print(l)
输出:
['X', 'A', 'B']
['A', 'X', 'B']
['A', 'B', 'X']