Jeffrey Schwab jeff at schwabcenter.com
Mon Nov 21 04:56:51 CET 2005

```rurpy at yahoo.com wrote:
> Shi Mu wrote:
>
>>How to run a function to make [1,2,4] become [[1,2],1,4],[2,4]]?
>>Thanks!
>
>
> You want [[1,2],[1,4],[2,4]]?  That is, all combinations of 2 items
> from
> the list?  You might want to look at:
> http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/190465
>
>
>>>>import * from xpermutations
>>>>[x for x in UniqueCombinations ([1,2,4], 2)]
>
> [[1, 2], [1, 4], [2, 4]]
>
> That web page also gives urls to other recipies that do the same thing.

Dang, that's better than my version.

\$ ./combinations.py 2 1 2 4
[['1', '2'], ['1', '4'], ['2', '4']]

def combinations( universe, n=None ):

"""
Return all possible combinations of length "n," where the
elements of each combination are taken from the list "universe."
"""

result = []

if n == None:
n = len( universe )

if n > len( universe ):
# No combination of elements can have cardinality
# greater than universe, which is by definition the list
# of all possible elements.
pass
elif n < 0:
# No combination can have negative cardinaltiy.
pass
elif n == 0:
# Only the empty combination has cardinality 0.
result.append( [ ] )
else:   # 0 < n <= len( universe )
for i in xrange( len( universe ) ):
elem = universe[i]
post = universe[i+1:]
for c in combinations( post, n - 1 ):
choice = [ elem ]
choice.extend( c )
result.append( choice )

return result

if __name__ == "__main__":

import sys

if len( sys.argv ) < 2:
sys.stderr.write(
"usage: %s <n> [elements ...]\n" % sys.argv[0] )
sys.exit(1)

n = int( sys.argv[1] )
print repr( combinations( sys.argv[2:], n ) )

```