为了账号安全,请及时绑定邮箱和手机立即绑定

如何获得列表元素的所有可能组合?

如何获得列表元素的所有可能组合?

如何获得列表元素的所有可能组合?我有一个包含15个数字的列表,我需要编写一些代码来生成这些数字的所有32,768种组合。我发现了一些代码(通过谷歌搜索)显然正在寻找我正在寻找的东西,但我发现代码相当不透明并且对使用它很谨慎。另外我觉得必须有一个更优雅的解决方案。我发生的唯一事情就是循环遍历十进制整数1-32768并将它们转换为二进制,并使用二进制表示作为过滤器来选择适当的数字。有谁知道更好的方法?使用map(),也许?
查看完整描述

3 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

这个答案错过了一个方面:OP要求所有组合...而不仅仅是长度“r”的组合。

所以你要么必须遍历所有长度“L”:

import itertoolsstuff = [1, 2, 3]for L in range(0, len(stuff)+1):
    for subset in itertools.combinations(stuff, L):
        print(subset)

或者 - 如果你想变得时髦(或者在你之后读取你的代码的大脑弯曲) - 你可以生成“combination()”生成器链,并迭代:

from itertools import chain, combinationsdef all_subsets(ss):
    return chain(*map(lambda x: combinations(ss, x), range(0, len(ss)+1)))for subset in all_subsets(stuff):
    print(subset)


查看完整回答
反对 回复 2019-05-29
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

这是一个懒惰的单行,也使用itertools:


from itertools import compress, product


def combinations(items):

    return ( set(compress(items,mask)) for mask in product(*[[0,1]]*len(items)) )

    # alternative:                      ...in product([0,1], repeat=len(items)) )

这个答案背后的主要思想是:有2 ^ N个组合 - 与长度为N的二进制字符串的数量相同。对于每个二进制字符串,您选择对应于“1”的所有元素。


items=abc * mask=###

 |

 V

000 -> 

001 ->   c

010 ->  b

011 ->  bc

100 -> a

101 -> a c

110 -> ab

111 -> abc

需要考虑的事项:


这就需要你可以调用len(...)的items(解决方法:如果items是像就像一台发电机的迭代,用第一把它变成一个列表items=list(_itemsArg))

这要求迭代的顺序items不是随机的(解决方法:不要疯狂)

这就要求项目是独一无二的,要不然{2,2,1}并{2,1,1}都将崩溃{2,1}(解决方法:使用collections.Counter作为一个下拉更换set;它基本上是一个多集...尽管你可能需要在以后使用tuple(sorted(Counter(...).elements())),如果你需要它是可哈希)

演示


>>> list(combinations(range(4)))

[set(), {3}, {2}, {2, 3}, {1}, {1, 3}, {1, 2}, {1, 2, 3}, {0}, {0, 3}, {0, 2}, {0, 2, 3}, {0, 1}, {0, 1, 3}, {0, 1, 2}, {0, 1, 2, 3}]


>>> list(combinations('abcd'))

[set(), {'d'}, {'c'}, {'c', 'd'}, {'b'}, {'b', 'd'}, {'c', 'b'}, {'c', 'b', 'd'}, {'a'}, {'a', 'd'}, {'a', 'c'}, {'a', 'c', 'd'}, {'a', 'b'}, {'a', 'b', 'd'}, {'a', 'c', 'b'}, {'a', 'c', 'b', 'd'}]


查看完整回答
反对 回复 2019-05-29
  • 3 回答
  • 0 关注
  • 1046 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信