我想提出以下几点:
(('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'),)调用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 但我觉得我走对了路。
此外,我还想使用第二个名为极限的参数来限制子元组的大小,例如,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'))我在用python 3。
发布于 2014-01-27 15:42:47
句柄大小写-当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示例用法:
>>> 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'),)>>> 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'))发布于 2014-01-27 15:48:41
如果您还可以使用列表而不是元组(或者不害怕以后对它们进行转换),您可以使用以下方法:
def subtuples(t):
for i in range(1<< (len(t)-1)):
result = [ [ t[0] ] ]
for j in range(len(t)-1):
if (1<<j) & i:
result[-1].append(t[j+1])
else:
result.append([ t[j+1] ])
yield result
for x in subtuples(('a', 'b', 'c', 'd')):
print(x)https://stackoverflow.com/questions/21384752
复制相似问题