【发布时间】:2017-06-03 16:37:05
【问题描述】:
我正在编写一个程序,它采用字符串的排列“模型”,并根据该模型输出所有排列。模型看起来像这样:
model = Mix([
[
"this",
PickOne(["is", "isn't"])
],
PickOne([
Mix([
"absolutely",
"great"
])
])
])
在输出的排列中,
-
listobjects 会依次输出包含的objects -
Mix对象将以所有可能的顺序输出包含的对象,最大长度(包括零) -
PickOne对象一次只会输出一个包含它的对象
因此,上述示例的期望输出将是:
[
["this", "is"],
["this", "isn't"],
["this", "is", "absolutely"],
["this", "is", "great"],
["this", "isn't", "absolutely"],
["this", "isn't", "great"],
["absolutely"],
["great"],
["absolutely", "this", "is"],
["great", "this", "is"],
["absolutely", "this", "isn't"],
["great", "this", "isn't"],
[]
]
到目前为止,我已经为 Mix 类实现了如下排列:
class Mix(list):
def __init__(self, *args, **kwargs):
super(Mix, self).__init__(*args, **kwargs)
self.permutations = []
for L in range(0, len(self)+1):
for subset in itertools.combinations(self, L):
subset_permutations = itertools.permutations(subset)
self.permutations.extend(subset_permutations)
而我的PickOne 课程就是这样
class PickOne(list):
pass
我计划在我的主要功能中进行测试并进行相应处理 (if type(obj) is PickOne: ...)。
itertools 为更简单的用例提供了简化和效率,但是我不知道它将如何帮助我实现这个(超出我已经在Mix 中实现的)。关于如何使用itertools 来帮助实现上述 Pythonic 实现的任何想法?
【问题讨论】:
-
我很难理解这一点。所以即使是一个简单的“列表”,如果它包含其他“排列模型”,也应该产生这些模型所有可能结果的乘积对吧?
-
没错。
标签: python algorithm permutation combinatorics itertools