Checking for a full house
Roy Smith
roy at panix.com
Wed May 25 22:20:00 EDT 2005
"mwdsmith" <reallarryboy at yahoo.com> wrote:
> Hi, I'm new to python, and I'm not sure if this is the place to post
> this kind of question; so feel free to tell me if I should take this
> elsewhere.
Well, that depends. Are we doing your homework assignment for you? :-)
> So, to start me off on python, I decided to put together a little
> script to test the probabilities of rolling certain combinations of
> dice. Below is my code for checking for a full house (when rolling
> with 5 dice). A roll is a list, eg [1, 3, 5, 1, 4] (this example is
> not a full house)
>
> def removeAll(element, num2Rem, list):
> l = list[:]
> for num in range(0, num2Rem):
> l.remove(element)
> return l
>
> def isfullHouse(roll):
> for die in range(1,7):
> if roll.count(die)==3:
> l = removeAll(die, 3, roll)
> if l[0]==l[1]:
> return 1
> return 0
>
> My questions is this: is there a better way to do this? A way that's
> more natural to python, or just more efficient perhaps?
Well, I think I might do two trips through a dictionary. Something like
the following. The arguments to the two dict() constructors are list
comprehensions. I don't normally use them a lot, and I don't normally like
complicated expressions like this, but I tried a few ways, and this just
seems to be the most compact way by far to do the counting. So, even
though I'm not convinced this is the clearest way to write it, you did ask
for the most pythonic way, and I think this might be that :-)
#!/usr/bin/env python
def isFullHouse (roll):
# count how many of each value you have, i.e. how many 1's,
# how many 2's, etc
valueDict = dict ([(x, 0) for x in range(1,7)])
for die in roll:
valueDict[die] += 1
# count how many of each set size you have, i.e. how many
# voids, how many singletons, how many pairs, etc.
setDict = dict ([(x, 0) for x in range(0,6)])
for setSize in valueDict.values():
setDict[setSize] += 1
# A full house is one pair and one three-of-a-kind
return setDict[2] == 1 and setDict[3] == 1
print isFullHouse ([1, 1, 1, 2, 2]) == True
print isFullHouse ([1, 1, 1, 1, 1]) == False
print isFullHouse ([1, 2, 3, 4, 5]) == False
print isFullHouse ([3, 4, 3, 3, 4]) == True
print isFullHouse ([1, 2, 1, 1, 1]) == False
More information about the Python-list
mailing list