possible pairings in a set

Dave Angel davea at ieee.org
Sat Apr 4 21:27:34 EDT 2009



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

 



More information about the Python-list mailing list