3 回答
TA贡献1859条经验 获得超6个赞
将元素添加到列表总是会增加优先级。我们可以维护一个列表列表并首先递归地添加最差的元素以获得所需的顺序。
cs = ["A", "B", "C"]
def subsets(xs):
res = [[]]
for x in xs[::-1]:
res = [[x] + r for r in res] + res
return res[:-1]
# [["A", "B", "C"], ["A", "B"], ["A", "C"], ["A"], ["B", "C"], ["B"], ["C"]]
在执行过程中,res看起来如下:
[[]]
[["C"],[]]
[["B","C"],["B"],["C"],[]]
...
或者,您可以依靠itertools.product获得一个懒惰的解决方案。
from itertools import product
def lazy_subsets(xs):
for ix in product(*([[True, False]] * len(xs))):
yield [x for x, b in zip(xs, ix) if b]
res = list(lazy_subsets(cs))[:-1]
这里,每个ix都是一个bools列表,用作过滤的布尔掩码xs。的顺序product的产率ix的一致上的子集的顺序xs给出到初始元素的优先级。
TA贡献1812条经验 获得超5个赞
您可以通过优先级函数对组合进行排序,该函数被定义为组合元素的原始索引的排序列表(较低的索引意味着更高的优先级)在最后用无穷大填充(因为我们希望给更高的长度组合一个机会对抗更低的长度组合):
from itertools import combinations
lst = ['A', 'B', 'C']
index = {l: i for i, l in enumerate(lst)}
def priority(c):
return sorted([index[x] for x in c]) + [float('inf')] * (len(lst) - len(c))
result = sorted([c for i in range(1, len(lst) + 1) for c in combinations(lst, i)], key=priority)
print(result)
# [('A', 'B', 'C'), ('A', 'B'), ('A', 'C'), ('A',), ('B', 'C'), ('B',), ('C',)]
TA贡献1789条经验 获得超8个赞
有点笨重,但这可以使用 itertools.combinations...
import itertools
def iter(string):
raw_result = []
result = []
for i in range(len(string), -1, -1):
for y in itertools.combinations(string, i):
if len(y) > 0:
raw_result.append(list(y))
for s in string:
for bit in raw_result:
if s == bit[0]:
result.append(bit)
return result
print(iter('ABCD'))
添加回答
举报