【问题标题】:Recursively generate Compositions from an ordered list从有序列表递归生成组合
【发布时间】:2015-08-25 05:57:44
【问题描述】:

给定一个包含“n”个元素的有序列表,我想对列表进行切片以仅生成子列表的每个不同排列,同时保持原始列表的顺序 - 即生成每个 Composition我的输入列表。 (这与从我的输入列表中计算所有可能的子列表的可能组合不同)。

例如,给定输入列表[A,B,C,D],我的输出将是以下 8 个嵌套列表:

[[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]].

绘制可能排列的树表明这个问题将适用于递归算法,但我不确定如何在 Python 中实现这一点以获得最大的速度和效率,非常感谢您的建议和指导。

【问题讨论】:

  • 你错过了 [[A], [BCD]]。 n 元素列表的可能结果数量不是2^(n - 1) 吗?您可以使用n - 1 位将分隔表示为二进制数;每个位代表一个间隙。
  • 感谢您这么快发现这一点。原始问题已适当编辑。

标签: python algorithm list recursion combinatorics


【解决方案1】:
def composition(seq):
    seq = tuple(seq)
    for i in range(2**(len(seq)-1)):
        result = [[seq[0]]]
        for j in range(len(seq)-1):
            if i & (1<<j):
                result.append([seq[j+1]])
            else:
                result[-1].append(seq[j+1])
        yield result

if __name__=="__main__":
    from pprint import pprint
    pprint(list(composition('ABCD')))

参考:https://en.wikipedia.org/wiki/Composition_(combinatorics)

【讨论】:

    猜你喜欢
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 2015-10-13
    • 2010-10-28
    • 1970-01-01
    • 2021-04-22
    • 2013-06-16
    相关资源
    最近更新 更多