2017-09-16 147 views
0

我有一个列表mylist=[1,2],我想以所有可能的方式在列表元素之间插入最大len(mylist)+1号码的元素'A' 。输出应该像这些,在Python中以所有可能的方式在列表元素之间插入一些相同的新元素

[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”列表中的元素之间。需要帮忙。

+0

感谢这个建议。我编辑了这个问题。 – ddas

回答

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' s转换列表中。

如果您确实需要在列表组之间输出空白行,您可能更愿意直接使用itertools.combinations(s, r)函数 - 这会给出s集合的所有子集,大小为r。循环播放r并打印结果列表,并在每个值r后打印一个空行。鉴于你想要的特定输出,这可能是最好的选择。

获得powerset的另一种方法使用FiniteSet类的powerset()方法sympysympy模块不是Python的标准部分,但如果您使用Anaconda安装来安装Python,则您已拥有它。

获得权力的另一种方式涉及到制作自己的递归或回溯程序。这是最困难的方式,但是这避免了使用任何模块。

以下是使用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'] 
+0

你已经很好地解释了,是的,我不需要这些空行。我也在用'itertools'尝试,但无法达到目标。谢谢你的帮助 :) – ddas

相关问题