首页 > 解决方案 > 如何使用 itertools 解决这个问题?

问题描述

你好我试过使用这个工具:

list(combinations('01', 3))

但我得到了这个结果:

[]

我想要这些结果:

000
001
011
111
101
100
010

另外,我也想有不同的情况。

例如,鉴于111我期望这些结果:

111
12
21
3

是否可以使用 来做这两件事itertools

标签: pythonitertools

解决方案


这是一个部分使用此答案中的解决方案的解决方案。

  • 亚历克西斯的答案(见链接)的分区函数返回分成组的列表(即[[[1,1,1]],[[1,1],[1]],[[1],[1, 1]],[[1],[1],[1]]]
  • 为了得到你问题中的数字,我添加了一个只存储每个内部列表总和的部分
  • list(dict.fromkeys(...)) 用于删除重复项

代码

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

    first = collection[0]
    for smaller in partition(collection[1:]):
        # insert `first` in each of the subpartition's subsets
        for n, subset in enumerate(smaller):
            yield smaller[:n] + [[ first ] + subset]  + smaller[n+1:]
        # put `first` in its own subset 
        yield [ [ first ] ] + smaller


elements = list([1,1,1])

lst = list(dict.fromkeys([ tuple([sum(p[1][i]) for i in range(len(p[1]))]) for p in enumerate(partition(elements), 1) ]))

print(sorted(lst))

输出:

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

推荐阅读