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

在Python中,以所有可能的方式在列表的元素之间插入许多相同的新元素,python,python-3.x,list,numpy,insert,Python,Python 3.x,List,Numpy,Insert,我有一个列表mylist=[1,2],我想以所有可能的方式在列表的元素之间插入元素'a'的最大len(mylist)+1个数。输出应该是这样的 [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 = lis

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

[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,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)
函数——这将提供大小
r
的set
s
的所有子集。循环
r
并打印结果列表,并在
r
的每个值后打印一个空行。考虑到您想要的特定输出,这可能是最好的选择

获取动力集的另一种方法是使用
sympy
FiniteSet
类的
powerset()
方法。
symphy
模块不是Python的标准部分,但是如果您使用Anaconda安装安装Python,您已经拥有了它

获取powerset的另一种方法是创建自己的递归或回溯例程。这是最困难的方法,但避免使用任何模块

下面是实现“最佳选项”的代码,直接使用
itertools.compositions
。我更改了您的变量,使其具有更好的名称和内容

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']

取你的列表,比如说<代码> [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)
函数——这将提供大小
r
的set
s
的所有子集。循环
r
并打印结果列表,并在
r
的每个值后打印一个空行。考虑到您想要的特定输出,这可能是最好的选择

获取动力集的另一种方法是使用
sympy
FiniteSet
类的
powerset()
方法。
symphy
模块不是Python的标准部分,但是如果您使用Anaconda安装安装Python,您已经拥有了它

获取powerset的另一种方法是创建自己的递归或回溯例程。这是最困难的方法,但避免使用任何模块

下面是实现“最佳选项”的代码,直接使用
itertools.compositions
。我更改了您的变量,使其具有更好的名称和内容

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']

你解释得很好,是的,我不需要那些空行。我也尝试了
itertools
,但未能达到目标。谢谢你的帮助:)你解释得很好,是的,我不需要那些空行。我也尝试了
itertools
,但未能达到目标。谢谢你的帮助:)谢谢你的建议。我已经编辑了这个问题。谢谢你的建议。我已经编辑了这个问题。