什么原因导致输出顺序不正确?蟒蛇

问题描述 投票:0回答:1

我的目标是以一维列表 l 作为参数,并将其所有分区作为列表返回。该函数返回一个三维Python列表,其中二级列表中包含的列表总共包含与输入列表l相同的元素,没有重复,并且单独包含这样的组合的所有组合。

我出错的地方似乎是在需要我对分区进行排序的部分。

这是我的代码:

from itertools import combinations

def makecomb(l):
    def partition(collection):
        if len(collection) == 1:
            yield [collection]
            return

        first = collection[0]
        for smaller in partition(collection[1:]):
            for n, subset in enumerate(smaller):
                yield smaller[:n] + [[first] + subset] + smaller[n + 1:]
            yield [[first]] + smaller

    result = list(partition(l))

    unique_result = [list(map(list, set(map(tuple, part)))) for part in result]

    def custom_sort(item):
        return (len(item), tuple(sorted(item[0], key=lambda x: l.index(x))))

    sorted_result = sorted(unique_result, key=custom_sort)

    return sorted_result

这是调用

makecomb([1,2,3])
时预期的输出:

[[[1], [2], [3]], [[1], [2, 3]], [[2], [1, 3]], [[3], [1, 2]], [[1, 2, 3]]]

相反,我得到了这个:

[[[1, 2, 3]], [[1, 2], [3]], [[2], [1, 3]], [[2, 3], [1]], [[1], [2], [3]]]

我现在尝试了不同的方法,但没有产生正确的输出。充其量我已经设法得到:

[[[1], [2], [3]], [[1, 2], [3]], [[2], [1, 3]], [[2, 3], [1]], [[1, 2, 3]]]

python sorting combinations partition
1个回答
0
投票

我认为你可以通过双重排序得到你想要的东西。

from itertools import combinations

def makecomb(l):
    def partition(collection):
        if len(collection) == 1:
            yield [collection]
            return

        first = collection[0]
        for smaller in partition(collection[1:]):
            for n, subset in enumerate(smaller):
                yield smaller[:n] + [[first] + subset] + smaller[n + 1:]
            yield [[first]] + smaller

    result = list(partition(l))
    unique_result = [list(map(list, set(map(tuple, part)))) for part in result]
    for x in unique_result:
        x.sort(key=lambda item: (len(item), item))
    unique_result.sort(key=lambda item: (-len(item), item))
    return unique_result

print(makecomb([1,2,3]))

这应该给你:

[[[1], [2], [3]], [[1], [2, 3]], [[2], [1, 3]], [[3], [1, 2]], [[1, 2, 3]]]
© www.soinside.com 2019 - 2024. All rights reserved.