[Tutor] Help with a Dictionary

Lie Ryan lie.1296 at gmail.com
Thu Jan 7 18:09:24 CET 2010


On 1/8/2010 3:12 AM, Garry Bettle wrote:
> This is what I've come up with.  Sorry, python is something I touch on
> occasionally:  must do more!
>
> As the races are output, I build a dictionary of key=FixtureName and
> value=RaceTimes:
>
> RaceTime = marketResp.market.displayTime.time()
> cRaceTime = RaceTime.strftime("%H%M")
> FixtureName = MarketSummary.marketName.strip()
> MarketName = marketResp.market.name
> if FixtureName not in FixtureList:
>      FixtureList[FixtureName] = cRaceTime
> else:
>      FixtureList[FixtureName]+= " " + cRaceTime
>
> And then, when I want the summary to be printed:
>
> for fixture in FixtureList:
>      print fixture.ljust(6), FixtureList[fixture]
>
> It works, but have I done it the "python" way?

In general, you should keep all data in object format and convert it to 
string just before printing it (except for data that is inherently a 
text). You can have FixtureList as a dict mapping FixtureName to a list 
of datetime objects.

Tips: you may want to see defaultdict from the collections module.

 >>> import collections
 >>> from datetime import datetime
 >>> a = collections.defaultdict(list)
 >>> fmt = '%Y-%m-%d %H%M'
 >>> a['Sund'].append(datetime.strptime('2010-01-07 1103', fmt))
 >>> a['Sheff'].append(datetime.strptime('2010-01-07 1111', fmt))
 >>> a['Sund'].append(datetime.strptime('2010-01-07 1119', fmt))
 >>> a
defaultdict(<class 'list'>, {'Sund': [datetime.datetime(2010, 1, 7, 11, 
3), datetime.datetime(2010, 1, 7, 11, 19)], 'Sheff': 
[datetime.datetime(2010, 1, 7, 11, 11)]})

It's much more versatile than keeping the time as a string; though for 
quick and dirty scripts keeping everything as a string may not be so 
much of a problem

> Can't I unpack both
> the key and value from FixtureList?

Assuming that FixtureList is a dict (why name it List?), you can use:

#python 2.0
for fixture, ractimes in FixtureList.iteritems():
     print fixture, racetimes

#python 3.0
for fixture, ractimes in FixtureList.items():
     print(fixture, racetimes)


> Another thing I'd like to change is the ljust().  I believe it's
> depreciated later in 3.0+, so I should really find an alternative.

No it isn't. What is deprecated is the 'string' module, in favor of 
"string method".

i.e. instead of:

import string
s = 'abc'
t = string.ljust(s, 10)

you should use

s = 'abc'
t = s.ljust(10)


And the last tips: http://www.python.org/dev/peps/pep-0008/



More information about the Tutor mailing list