I'm trying to make a list of all possible 5 card poker hands to use in some computations (that may be slow but is preferably somewhat speedy). Now to get a list, I wrote the following code:
import itertools
# All possible Cards:
cards = ['2s', '2h', '2d', '2c', '3s', '3h', '3d', '3c', '4s', '4h', '4d', '4c', '5s', '5h', '5d', '5c', '6s', '6h', '6d', '6c', '7s', '7h', '7d', '7c', '8s', '8h', '8d', '8c', '9s', '9h', '9d', '9c', 'Ts', 'Th', 'Td', 'Tc', 'Js', 'Jh', 'Jd', 'Jc', 'Qs', 'Qh', 'Qd', 'Qc', 'Ks', 'Kh', 'Kd', 'Kc', 'As', 'Ah', 'Ad', 'Ac']
hands = []
# Collect all non-trivial cartesian products
for element in itertools.product(cards,cards,cards,cards,cards):
c1,c2,c3,c4,c5 = element
if c1 != c2 or c1!=c3 or c1!=c4 or c1!=c5 or c2 != c3 or c2 != c4 or c2 != c5 or c3 != c4 or c3 != c5 or c4 != c5:
hands.append([c1,c2,c3,c4,c5])
# Sort all elements and delete duplicates
for x in hands:
x.sort()
hands = [tuple(x) for x in hands]
hands = list(set(hands))
# Convert hands back to a list
hands = [list(x) for x in hands]
# Verify result
print(str(len(hands)))
But this runs out of memory before it's completed (over 11 gigs of RAM). I'm trying to use that list so I can exhaustively test against the set of all possible hands when I try to put 2 hands up against one another.
Does anyone know how I could make this code better?
First, the function you are trying to create already exists: itertools.combinations
. Second, try to structure your code so that you can iterate over all possible hands without putting them all in memory simultaneously.
Here is a short program that prints all possible hands, with duplicate hands removed, but never creates an in-memory list of all possible hands:
import itertools
cards = [''.join(x) for x in itertools.product('23456789TJQKA', 'shdc')]
for hand in itertools.combinations(cards, 5):
print (hand)
If you actually need the entire list to be in memory, try:
import itertools
cards = [''.join(x) for x in itertools.product('23456789TJQKA', 'shdc')]
big_list = list(itertools.combinations(cards, 5))
print len(big_list)