python - 返回列表的子组合

标签 python python-3.x

我有一个返回列表中所有组合的函数:

def sub_combinations(segment):
  if len(segment) == 1:
    yield (segment,)
  else:
    for x, j in enumerate(sub_combinations(segment[1:])):
      yield ((segment[0],),)+j
      for k in range(len(j)):
         yield (((segment[0],)+j[k]),) + (j[:k]) +(j[k+1:])

但是我如何让它只返回子组合:

((1,), (2,), (3,), (4,))
((1, 2), (3,), (4,))
((1, 3), (2,), (4,))
((1, 4), (2,), (3,))
((1,), (2, 3), (4,))
((1, 2, 3), (4,))
((1, 4), (2, 3))
((1,), (2, 4), (3,))
((1, 2, 4), (3,))
((1, 3), (2, 4))
((1,), (2,), (3, 4))
((1, 2), (3, 4))
((1, 3, 4), (2,))
((1,), (2, 3, 4))

而不是:

((1,), (2,), (3,), (4,))
((1, 2), (3,), (4,))
((1, 3), (2,), (4,))
((1, 4), (2,), (3,))
((1,), (2, 3), (4,))
((1, 2, 3), (4,))
((1, 4), (2, 3))
((1,), (2, 4), (3,))
((1, 2, 4), (3,))
((1, 3), (2, 4))
((1,), (2,), (3, 4))
((1, 2), (3, 4))
((1, 3, 4), (2,))
((1,), (2, 3, 4))
((1, 2, 3, 4),)  # remove this

当调用它时:

sub_combinations((1,2,3,4))

这是我的尝试,但不起作用:

def sub_combinations(segment, d=0):
  if len(segment) == 1:
    yield (segment,)
  else:
    for x, j in enumerate(sub_combinations(segment[1:]), d+1):
      yield ((segment[0],),)+j
      for k in range(len(j)):
         r = (((segment[0],)+j[k]),) + (j[:k]) +(j[k+1:])
         if d == 0 and r == (segment,): continue
         yield r

最佳答案

我认为你应该分成两个函数,每个函数都有自己的功能。第一个只是在您实现时创建组合,第二个只是包装它,并过滤不需要的段。

类似于:

from itertools import filterfalse

def get_combinations(segment):
    pass # your implementation


def get_sub_combinations(segment, filter_func=lambda x: x == segment):
    yield from filterfalse(filter_func, get_combinations(segment))

关于python - 返回列表的子组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53811674/

相关文章:

python - Networkx:如何在图形绘图中显示节点和边属性

python - 从存储在数组中的波形播放声音

python-3.x - 模块在没有明确指示的情况下重新加载和重置

使用 suds-jurko 的 Dynamics GP 的 Python 3 SOAP 客户端

python - 对多列应用 lambda 函数

python - 计算numpy数组的边界框

python - 如何找到两个 Pandas DataFrame 之间的差异

python - 如何使用 Systemd 进行 Django-q 守护进程

python - 计算python中范围内列表中的 float 数量

python - 为什么我的代码很慢(它还能工作吗)? [欧拉计划 12][Python 3.3]