[Tutor] Poor style to use list as "array"?
bob gailer
bgailer at gmail.com
Mon Jul 6 05:19:10 CEST 2009
Angus Rodgers wrote:
> The problem this time is, given an amount of US currency in cents
> (and less than a dollar), to print out a description of the coins
> needed to represent it, using the smallest number of coins. E.g.:
>
> How many cents this time? 59
> 2 quarters, 1 nickel and 4 pennies.
>
> How many cents this time? 55
> 2 quarters and 1 nickel.
>
> How many cents this time? 75
> 3 quarters.
>
> My program relaxes the restriction to amounts less than a dollar,
> and initialises the necessary data structures as follows:
>
> denom = ['dollar', 'quarter', 'dime', 'nickel', 'penny']
> value = [100, 25, 10, 5, 1]
> LEN = 5
> plural = [None] * LEN
> plural[-1] = 'pennies'
> count = [None] * LEN # Kludge
>
I'm inclined to use a class. I omitted the input and loop for "simplicity".
class Coin:
def __init__(self, name, value, plural=None):
self.name = name
self.value = value
if plural:
self.plural = plural
else:
self.plural = self.name + 's'
self.count = 0
def display(self):
if self.count == 0:
return None
if self.count == 1:
return "%d %s" % (self.count, name)
else:
return "%d %s" % (self.count, self.plural)
coins = Coin('dollar', 100), Coin('quarter', 25), Coin('dime', 10),
Coin('nickel', 5), Coin('penny', 1, 'pennies')
amnt = 99
buff = []
for coin in coins:
(coin.count, amnt) = divmod(amnt, coin.value)
d = coin.display()
if d:
buff.append(d)
if len(buff) < 2:
print buff
else:
print ', '.join(buff[:-1]) + " and " + buff[-1]
> I use the list 'count' as a kind of array, so that e.g. count[-1]
> is the number of pennies needed, count[2] is the number of dimes
> needed, and so on. Any initial values I might store as elements
> of the list are never used, hence the use of 'None'. (The use of
> 'None' in the list 'plural' is much more defensible, I think, as
> it is used to denote the formation of a regular plural by adding
> 's' to the name.) Instead, the actual values are assigned in a
> 'for' loop, as follows:
>
> for i in range(LEN - 1):
> (count[i], amnt) = divmod(amnt, value[i])
>
> This feels like a bit of a cheat, as if I am trying to program in
> Python as if it were some other more familiar language. Should I
> have coded this differently?
>
> The full source code is here, in case anyone wants to look at it
> (but I'm not soliciting any more attention, as I've already been
> given quite a lot of it, and fear being offered the comfy chair!):
> <http://python.pastebin.com/d5e321ae0> (retention: 1 day)
>
> Could I have used dictionaries instead, with the denomination names
> as keys? Is it possible to guarantee a sequence in which the keys
> of a dictionary are iterated through? (If not, I suppose I could
> keep the list 'denom' as it is here, and iterate through it with
> "for key in denom:", although this seems a bit redundant.)
>
--
Bob Gailer
Chapel Hill NC
919-636-4239
More information about the Tutor
mailing list