Baz*_*Baz 6 python algorithm python-3.x
我希望得到以下结论:
(('A',), ('B',), ('C',), ('D',))
(('A',), ('B',), ('C','D'))
(('A',), ('B','C'), ('D',))
(('A',), ('B','C','D'))
(('A','B'), ('C',), ('D',))
(('A','B'), ('C','D'))
(('A','B','C'), ('D',))
(('A','B','C','D'),)
Run Code Online (Sandbox Code Playgroud)
在打电话时 sub_combinations(('A', 'B', 'C', 'D'))
这是我的尝试,但它不起作用:
def sub_combinations(segment):
for i in range(1, len(segment)):
for j in sub_combinations(segment[i:]):
yield segment[:i]+j
yield segment
Run Code Online (Sandbox Code Playgroud)
但我认为我走在正确的轨道上.
另外,我想要一个名为limit的第二个参数来限制子元组的大小,例如它sub_combinations(('A', 'B', 'C', 'D'), 2)会给出:
(('A',), ('B',), ('C',), ('D',))
(('A',), ('B',), ('C','D'))
(('A',), ('B','C'), ('D',))
(('A','B'), ('C',), ('D',))
(('A','B'), ('C','D'))
Run Code Online (Sandbox Code Playgroud)
我正在使用python 3.
处理基础案例 - 何时segment为空:
def sub_combinations(segment, size=0):
if segment == ():
yield ()
return
stop = min(size or len(segment), len(segment))
for i in range(1, stop + 1):
for j in sub_combinations(segment[i:], size):
yield (segment[:i],) + j
Run Code Online (Sandbox Code Playgroud)
用法示例:
>>> for x in sub_combinations(('A', 'B', 'C', 'D')):
... print(x)
...
(('A',), ('B',), ('C',), ('D',))
(('A',), ('B',), ('C', 'D'))
(('A',), ('B', 'C'), ('D',))
(('A',), ('B', 'C', 'D'))
(('A', 'B'), ('C',), ('D',))
(('A', 'B'), ('C', 'D'))
(('A', 'B', 'C'), ('D',))
(('A', 'B', 'C', 'D'),)
Run Code Online (Sandbox Code Playgroud)
>>> for x in sub_combinations(('A', 'B', 'C', 'D'), 2):
... print(x)
...
(('A',), ('B',), ('C',), ('D',))
(('A',), ('B',), ('C', 'D'))
(('A',), ('B', 'C'), ('D',))
(('A', 'B'), ('C',), ('D',))
(('A', 'B'), ('C', 'D'))
Run Code Online (Sandbox Code Playgroud)