扬帆大鱼
这是一个懒惰的单行,也使用itertools:from itertools import compress, productdef 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=### | V000 -> 001 -> c010 -> b011 -> bc100 -> a101 -> a c110 -> ab111 -> 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'}]