在Python中将值插入列表中的特定位置

时间:2010-02-07 20:38:26

标签: python list

我正在尝试打印给定列表的所有可能结果,我想知道如何将值放入列表中的各个位置。例如,如果我的列表是[A,B],我想将X插入到列表的所有可能索引中,以便它返回此[X,A,B][A,X,B],{{1 }}。

我在考虑使用[A,B,X]和for循环,但不知道如何开始。

8 个答案:

答案 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)

只是为了好玩,一个解决方案:

  1. 允许将多个值插入所有可能的位置,而不仅仅是一个,并且
  2. 尽量减少临时工
  3. 不对插入调用 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")

Try it online!

产生以下形式的输出:

['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")

Try it online!

行为相同,但产生输出,其中 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']