possible pairings in a set

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
>>     finallist = []
>>         for player in cleanlist:
>>             mini = cleanlist[start],cleanlist[follow]
>>             finallist.append(mini)
>>         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)]

```