在Python中以所有可能的方式在列表的元素之间插入许多相同的新元素

时间:2017-09-16 15:42:36

标签: python python-3.x list numpy insert

我有一个列表mylist=[1,2],我希望以所有可能的方式在列表的元素之间插入元素len(mylist)+1的最大数量'A'。输出应该是这样的,

[1, 2]    

['A', 1, 2]
[1, 'A', 2]
[1, 2, 'A']

['A', 1,'A', 2]
['A',1, 2, 'A']
[1, 'A', 2,'A']

['A', 1,'A', 2, 'A']

到目前为止,我只能插入一个' A'在列表中以各种可能的方式。这是我的代码,

m = 3    
mylist = list(range(1,m))    
for j in range (len(mylist)+1):
    newlist = mylist[:j] + ['A'] + mylist[j:]
    print(newlist)

,输出为,

['A', 1, 2]
[1, 'A', 2]
[1, 2, 'A']

当我必须插入两个' A'在列表的元素之间。需要帮助。

1 个答案:

答案 0 :(得分:2)

列出你的清单,说[1,2],并考虑元素之间的空格。由于我们的示例中有两个元素,因此有三个空格。我们称他们为0, 1, 2。您希望将信件'A'放在这些空格中。虽然你没有这么说,但从你的例子中可以看出,每个空格最多只能有一个字母,所以没有重复。

因此,您希望获得集合{0, 1, 2}的所有可能子集。对于每个集合,在该集合中的该空间放置一个字母'A'

所有子集的集合称为“功率集”。 Python并没有内置,但有几种方法可以实现它。以下是使用itertools内置模块的一种方法。

import itertools

def powerset(iterable):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = list(iterable)
    return itertools.chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

使用它来获取空间集,然后使用每组将'A'插入列表中。

如果您确实希望在列表组之间输出中出现空行,您可能更喜欢直接使用itertools.combinations(s, r)函数 - 这会为s的所有子集设置r 。循环遍历r并打印生成的列表,并在r的每个值后打印一个空行。鉴于您想要的特定输出,这可能是最佳选择。

获取powerset的另一种方法是使用powerset() FiniteSetsympy的{​​{1}}方法。 sympy模块不是Python的标准部分,但是如果您使用Anaconda安装安装了Python,那么它已经拥有它。

获得powerset的另一种方法是让你制作自己的递归或反向跟踪程序。这是最困难的方法,但这可以避免使用任何模块。

以下是直接使用itertools.combinations实现“最佳选项”的代码。我将变量更改为更好的名称和内容。

from itertools import combinations

mylistsize = 2
myinsertitem = 'A'
mylist = list(range(1, mylistsize+1))

allspaceplaces = list(range(mylistsize+1))
for numinserts in range (mylistsize + 2):
    if numinserts:
        print()
    for spaceplaces in combinations(allspaceplaces, numinserts):
        newlist = []
        lo = 0
        for hi in spaceplaces:
            newlist.extend(mylist[lo:hi])
            newlist.append(myinsertitem)
            lo = hi
        newlist.extend(mylist[lo:])
        print(newlist)

该代码的打印输出为

[1, 2]

['A', 1, 2]
[1, 'A', 2]
[1, 2, 'A']

['A', 1, 'A', 2]
['A', 1, 2, 'A']
[1, 'A', 2, 'A']

['A', 1, 'A', 2, 'A']