打印包含n个元素的集合的所有组合,在包含j个元素的子集之间拆分,同时保留字母顺序

2024-04-18 20:29:08 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个n=3个元素的集合:[a,b,c]

利用组合学,我们知道这个集合有8个子集,其中有j个元素:

[∅], [a], [b], [c], [a,b], [a,c], [b,c], [a,b,c]

现在我想用Python打印这8个子集的所有排列,约束条件是每个排列必须正好有3个子集(空的子集很好),必须使用所有元素,并且必须在每个子集中保持字母顺序(字母顺序不需要在外部保持)例如[c],[a],[b]就是好的)。你知道吗

我尝试过这样的事情:

x=1
y=3

for i in set(permutations(chain.from_iterable(set_n))):
    while x<=3:
        permuted = sorted([i[:y], i[x:]])
        x = x+1
        y = y-1

    print permuted

其中set_n是我的n个元素的集合,但这当然只给出了两个子集的排列,并且只给出了这两个子集的一个排列。它也没有在子集中保持字母顺序。你知道吗


Tags: infrom元素利用chainfor顺序字母
1条回答
网友
1楼 · 发布于 2024-04-18 20:29:08

首先,请注意没有隐式排序:在Python中没有,在set代数中也没有。你知道吗

我建议你从一个困难的角度来解决这个问题。与其从C(8,3)的可能性中精确地找到你想要的排列,为什么不生成你想要的排列,而不是更多呢?你知道吗

从空的子列表开始。重复3^3种可能性,将每个字母放在指定的子列表中。对子列表排序并打印。你知道吗

for ai in range(3):
    for bi in range(3):
        for ci in range(3):
            permute = [ [], [], [] ]
            permute[ai].append('a')    
            permute[bi].append('b')    
            permute[ci].append('c')
            print(permute)

输出:

[['a', 'b', 'c'], [], []]
[['a', 'b'], ['c'], []]
[['a', 'b'], [], ['c']]
[['a', 'c'], ['b'], []]
[['a'], ['b', 'c'], []]
[['a'], ['b'], ['c']]
[['a', 'c'], [], ['b']]
[['a'], ['c'], ['b']]
[['a'], [], ['b', 'c']]
[['b', 'c'], ['a'], []]
[['b'], ['a', 'c'], []]
[['b'], ['a'], ['c']]
[['c'], ['a', 'b'], []]
[[], ['a', 'b', 'c'], []]
[[], ['a', 'b'], ['c']]
[['c'], ['a'], ['b']]
[[], ['a', 'c'], ['b']]
[[], ['a'], ['b', 'c']]
[['b', 'c'], [], ['a']]
[['b'], ['c'], ['a']]
[['b'], [], ['a', 'c']]
[['c'], ['b'], ['a']]
[[], ['b', 'c'], ['a']]
[[], ['b'], ['a', 'c']]
[['c'], [], ['a', 'b']]
[[], ['c'], ['a', 'b']]
[[], [], ['a', 'b', 'c']]

是的,这是蛮力。简化(例如参见itertools.product)留给读者作为练习。:-)

相关问题 更多 >