我的目标是以一维列表 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]]]
我认为你可以通过双重排序得到你想要的东西。
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]]]