possible pairings in a set

MRAB google at mrabarnett.plus.com
Sun Apr 5 03:40:30 CEST 2009


Dave Angel wrote:
> 
> 
> Ross wrote:
>> I'm new to python and I'm trying to come up with a function that takes
>> a given number of players in a game and returns all possible unique
>> pairings. Here's the code I've come up with so far, but I'm not
>> getting the output I'd like to:
>>
>> def all_pairings(players):
>>     cleanlist = []
>>     for i in range(players):
>>         cleanlist.append(i)
>>     return cleanlist
>>     start = 0
>>     follow = start +1
>>     finallist = []
>>     while follow <= len(cleanlist)-1:
>>         for player in cleanlist:
>>             mini = cleanlist[start],cleanlist[follow]
>>             finallist.append(mini)
>>             follow +=1
>>         start+=1
>>     return finallist
>>
>> If I were to execute the function with all_pairings(4), I want to get
>> the output [[0,1],[0,2],[0,3],[1,2],[1,3],[2,3]. Instead, I get
>> [0,1,2,3] with the code I currently have. Can you guys help me out?
>> Also, if my code is considered ugly or redundant by this community,
>> can you make suggestions to clean it up?
>>
>>   
> First problem is the return you have in the middle of the function, 
> which returns cleanlist.  That's why you're getting [0, 1, 2, 3]
> 
> Once you fix that, you'll find you have exceptions in the code where 
> cleanlist[follow] doesn't work if follow is equal to 4.
> 
> I'm afraid the code is ugly, and therefore hard to understand or fix.  
> Let me suggest an approach, rather than just giving you the code.  Why 
> not create a nested for which generates two subscripts between 0 and 4, 
> then append only those pairs in which the second is strictly greater 
> than the first.  It won't be the quickest, but it will be easy to follow.
> 
> No while loop, no explicit incrementing of variables, and in fact no 
> subscripting of the lists.  Just let them supply their own values.
>      cleanlist = range(players)             # no need for any loop, it's 
> already a list (except in Python 3.0, in which case it's a sequence that 
> still works just as well)
>      finallist = []
>      for i .....:
>              for j...
>                       if i<j:
>                             append ...
>      return finallist
> 
Actually, cleanlist[i] == i, so it's pointless. You can do just:

     finallist = []
     for i in range(players):
         for j in range(i + 1, players):
             finallist.append((i, j))

or, using list comprehension:

     finallist = [(i, j) for i in range(players) for j in range(i + 1, 
players)]



More information about the Python-list mailing list