Dynamic Lists, or...?
Steven D'Aprano
steve at REMOVETHIScyber.com.au
Mon Jun 13 04:43:10 EDT 2005
On Sat, 11 Jun 2005 10:30:53 -0700, Lorn wrote:
> I'm trying to figure out a way to create dynamic lists or possibly
> antother solution for the following problem. I have multiple lines in a
> text file (every line is the same format) that are iterated over and
> which need to be compared to previous lines in the file in order to
> perform some simple math. Each line contains 3 fileds: a descriptor and
> two integers. Here is an example:
>
> rose, 1, 500
> lilac, 1, 300
> lilly, 1, 400
> rose, 0, 100
>
> The idea is that the 0/1 values are there to let the program know
> wether to add or subtract the second integer value for a specific
> descriptor (flower in this case). So the program comes upon rose, adds
> the 500 to an empty list, waits for the next appearance of the rose
> descriptor and then (in this case) subtracts 100 from 500 and prints
> the value. If the next rose was a 1 then it would have added 100.
Why not just use a leading minus sign for the number if it is to be
subtracted?
> I'm uncertain on how to approach doing this though. My idea was to
> somehow be able to create lists dynamically upon each new occurence of a
> descriptor that currently has no list and then perform the calculations
> from there. Unfortunately, the list of descriptors is potentially
> infinte, so I'm unable to previously create lists with the descriptor
> names. Could anyonw give any suggestions on how to best approach this
> problem, hopefully I've been clear enough? Any help would be very gratly
> appreciated.
Use a dictionary:
def update_dict(D, key, sign, value):
"""Update dictionary D item with key by adding
or subtracting value."""
if not sign:
value = -value
x = D.get(key, 0)
D[key] = x + value
def split_line(s):
"""Split a string s into a tuple (key, sign, value),
ignoring whitespace."""
L = s.split(",")
return L[0].strip(), L[1].strip(), L[2].strip()
# WARNING: insufficient error checking for real world use.
Then call them like this:
D = {}
for line in sourcetext:
key, sign, value = split_line(line)
update_dict(D, key, sign, value)
Oh, by the way... just in case this is homework, which I'm sure it isn't
<wink>, I've deliberately left a teeny tiny bug in the code. You'll find
the bug pretty much the first time you run it, and the fix is very simple.
--
Steven.
More information about the Python-list
mailing list