把你的名单,如[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()
方法sympy
。 sympy
模块不是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']
感谢这个建议。我编辑了这个问题。 – ddas