拿出你的清单,比如[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) 函数——这会给出大小为r 的集合s 的所有子集。循环r 并打印结果列表,并在r 的每个值之后打印一个空行。鉴于您想要的特定输出,这可能是最好的选择。
获取powerset的另一种方法是使用FiniteSet类sympy的powerset()方法。 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']