> because a set avoids duplicates. If you say "I want to document my > achievements for posterity" I would recommend that you print to a file > rather than append to a list and the original code could be changed to > > with open("somefile") as f: > for achievement in my_achievements: > print(achievement.description, file=f) > > > Back to my coding hint: Don't repeat yourself. If you move the pieces > > >> > meetattrs = ('id', 'venue', 'date', 'rail', 'weather', > >> > 'trackcondition') > >> > >> > meet = d('meeting') > >> > >> > meetdata = [[meet.eq(i).attr(x) > >> > for x in meetattrs] for i in range(len(meet))] > > into a function > > def extract_attrs(nodes, attrs): > return [[nodes.eq(i).attr(name) for name in attrs] > for i in range(len(nodes))] > > You can reuse it for clubs, races, etc.: > > meetdata = extract_attrs(d("meeting"), meetattrs) > racedata = extract_attrs(d("race"), raceattrs) > > If you put the parts into a dict you can generalize even further: > > tables = { > "meeting": ([], meetattrs), > "race": ([], raceattrs), > } > for name, (data, attrs) in tables.items(): > data.extend(extract_attrs(d(name), attrs)) >
I find that really cool. Reads well to, hadn't considered approaching it that way at all. > So you want to go from a tree structure to a set of tables that preserves > the structure by adding foreign keys. You could try a slightly different > approach, something like > > for meeting in meetings: > meeting_table.append(...meeting attrs...) > meeting_id = ... > for race in meeting: > race_table.append(meeting_id, ...meeting attrs...) > race_id = ... > for nomination in race: > nomination_table.append(race_id, ...nomination attrs...) > > I don't know how to spell this in PyQuery -- with lxml you could do > something like > > meeting_table = [] > race_table = [] > nomination_table = [] > tree = lxml.etree.parse(filename) > for meeting in tree.xpath("/meeting"): > meeting_table.append([meeting.attrib[name] for name in meetattrs]) > meeting_id = meeting.attrib["id"] > for race in meeting.xpath("./race"): > race_table.append( > [meeting_id] + [race.attrib[name] for name in raceattrs]) > race_id = race.attrib["id"] > for nomination in race.xpath("./nomination"): > nomination_table.append( > [race_id] > + [nomination.attrib[name] for name in horseattrs]) > > Not as clean and not as general as I would hope -- basically I'm neglecting > my recommendation from above -- but if it works for you I might take a > second look later. I need to play around with this just to understand it more, really like it. Might try and implement your advice from before and put it in a function. Sayth -- https://mail.python.org/mailman/listinfo/python-list