Nestor wrote: [...]
But then somebody else submitted this Haskell solution:
import Data.List f :: (Ord a,Num a) => [a] -> Bool f lst = (\y -> elem y $ map sum $ subsequences $ [ x | x <- lst, x /= y ]) $ maximum lst
I wonder if we should add a subsequences function to itertools or make the "r" parameter of combinations optional to return all combinations up to len(iterable).
You really don't do your idea any favours by painting it as "Haskell envy". I have mixed ideas on this. On the one hand, subsequences is a natural function to include along with permutations and combinations in any combinatorics tool set. As you point out, Haskell has it. So does Mathematica, under the name "subsets". But on the other hand, itertools is arguably not the right place for it. If we add subsequences, will people then ask for partitions and derangements next? Where will it end? At some point the line needs to be drawn, with some functions declared "too specialised" for the general itertools module. (Perhaps there should be a separate combinatorics module.) And on the third hand, what you want is a simple two-liner, easy enough to write in place: from itertools import chain, combinations allcombs = chain(*(combinations(data, i) for i in range(len(data)+1))) which is close to what your code used. However, the discoverability of this solution is essentially zero (if you don't know how to do this, it's hard to find out), and it is hardly as self-documenting as from itertools import subsequences allcombs = subsequences(data) Overall, I would vote +0.5 on a subsequences function. -- Steven