Combinations or Permutations

Chris Kaynor ckaynor at zindagigames.com
Tue Sep 21 03:06:34 CEST 2010


One of the advantages of using itertools is that it is written in C rather
than Python (at least for CPython) and thus should run significantly faster
than a pure Python implementation.

Chris


On Mon, Sep 20, 2010 at 4:21 PM, Dave Angel <davea at ieee.org> wrote:

>  On 2:59 PM, Seth Leija wrote:
>
>> I need to know how to generate a list of combinations/permutations
>> (can't remember which it is). Say I have a list of variables:
>>
>> [a,b,c,d,...,x,y,z]
>>
>> I am curious if there is an optimized way to generate this:
>>
>> [[a,b],[a,c],[a,d],...,[x,z],[y,z]]
>>
>> I currently have an iteration that does this:
>>
>> #list.py
>>
>> from math import *
>>
>> list1=['a','b','c','d','e']
>> list2=[]
>> length=len(list1)
>>
>> for it1 in range(0 ,length):
>>     for it2 in range(it1+1, length):
>>         list2.append([list1[it1],list1[it2]])
>>
>> print list2
>>
>> However, this is one of the slowest parts of my function (beaten only
>> by variable instantiation). I posted this on another forum looking to
>> see if there was a different method completely. They said that my
>> method was about as simple as it could get, but I might be able to
>> find out how to optimize my code here.
>>
>> Thanks in advance.
>>
>>  You're apparently looking for combinations.  You're asking for all the
> combinations of items from the original list, taken two at a time.
>
> Permutations would also include the reverse of each item, so it would be
> exactly twice the size.
>
> For the specific case of two, your approach is about as simple as it can
> get.  However, generalizing the code to handle 'r' at a time is pretty
> tricky.  There's a library function for it in Python 2.6 and later, as
> mentioned by others, and the docs show a sample implementation.
>
> Clearly making a single function call is optimized in one sense.  However,
> if you're looking for speed, chances are you could improve on your own
> function by changing the two loops.  (tested in python 2.6)
>
> Consider:
>
>
> list1=['a','b','c','d','e']
> list2=[]
>
> for it1, val1 in enumerate(list1):
>    for val2 in list1[it1+1:]:
>        list2.append([val1, val2])
>
> print list2
>
>
> DaveA
>
>
>
>
>
>
>
> --
> http://mail.python.org/mailman/listinfo/python-list
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20100920/0d263453/attachment.html>


More information about the Python-list mailing list