On Fri, 15 Apr 2011 13:58:22 +1000, Chris Angelico wrote: > The dictionary is potentially a lot larger than this particular set of > values (it's a mapping of header:value for a row of a user-provided CSV > file). Does this make a difference to the best option? (Currently I'm > looking at "likely" figures of 60+ keys in the dictionary and 3-8 > postage options to pick up, but both of those could increase > significantly before production.)
SIXTY keys? When you get to sixty thousand keys, it might take a few seconds to process. > Efficiency is important, though not king; this whole code will be inside > a loop. But readability is important too. > > I can't just give all of dct.values() to parse_kwdlist; the function > parses a particular format of text string, and it's entirely possible > that other values would match that format (some of them are pure > free-form text). This has to get only the ones starting with Keyword, > and in order. Steven, the line you suggested: > > lst = [parse_kwdlist(dct["Keyword%d"%i]) for i in xrange(1, len(dct)+1)] > > will bomb with KeyError when it hits the first one that isn't present, I > assume. Is there an easy way to say "and when you reach any exception, > not just StopIteration, return the list"? (I could wrap the whole "lst = > " in a try/except, but then it won't set lst at all.) No. You could use the list comprehension form at the cost of running over the dict twice: maxkey = 0 for key in dct: if key.startswith("Keyword"): maxkey = max(maxkey, int(key[7:])) lst = [parse_kwdlist(dct["Keyword%d"%i]) for i in xrange(1, maxkey+1)] but quite frankly, at this point I'd say, forget the one-liner, do it the old-fashioned way with a loop. Or change your data structure: often you can simplify a task drastically just by changing the way you store the data. -- Steven -- http://mail.python.org/mailman/listinfo/python-list