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

这是一个懒惰的单行,也使用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'}]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值