Reading a file into a data structure....
Chris Rebert
clp2 at rebertia.com
Sat Oct 15 00:47:53 EDT 2011
On Fri, Oct 14, 2011 at 7:59 PM, MrPink <tdsimpson at gmail.com> wrote:
> This is what I have been able to accomplish:
>
> def isInt(s):
> try:
> i = int(s)
> return True
> except ValueError:
> return False
>
> f = open("powerball.txt", "r")
> lines = f.readlines()
> f.close()
>
> dDrawings = {}
> for line in lines:
> if isInt(line[0]):
> t = line.split()
> d = t[0]
> month,day,year = t[0].split("/")
> i = int(year + month + day)
> wb = t[1:6]
> wb.sort()
> pb = t[6]
> r = {'d':d,'wb':wb,'pb':pb}
> dDrawings[i] = r
>
> The dictionary dDrawings contains records like this:
> dDrawings[19971101]
> {'pb': '20', 'd': '11/01/1997', 'wb': ['22', '25', '28', '33', '37']}
>
> I am now able to search for ticket in a date range.
> keys = dDrawings.keys()
> b = [key for key in keys if 20110909 <= key <= 20111212]
>
> How would I search for matching wb (White Balls) in the drawings?
>
> Is there a better way to organize the data so that it will be flexible
> enough for different types of searches?
> Search by date range, search by pb, search by wb matches, etc.
>
> I hope this all makes sense.
from datetime import datetime
from collections import namedtuple, defaultdict
# for efficient searching by date: import bisect
DATE_FORMAT = "%m/%d/%Y"
Ticket = namedtuple('Ticket', "white_balls powerball date".split())
powerball2ticket = defaultdict(set)
whiteball2ticket = defaultdict(set)
tickets_by_date = []
with open("powerball.txt", "r") as f:
for line in f:
if not line[0].isdigit():
# what are these other lines anyway?
continue # skip such lines
fields = line.split()
date = datetime.strptime(fields[0], DATE_FORMAT).date()
white_balls = frozenset(int(num_str) for num_str in fields[1:6])
powerball = int(fields[6])
ticket = Ticket(white_balls, powerball, date)
powerball2ticket[powerball].add(ticket)
for ball in white_balls:
whiteball2ticket[ball].add(ticket)
tickets_by_date.append(ticket)
tickets_by_date.sort(key=lambda ticket: ticket.date)
print(powerball2ticket[7]) # all tickets with a 7 powerball
print(whiteball2ticket[3]) # all tickets with a non-power 3 ball
Cheers,
Chris
--
http://rebertia.com
More information about the Python-list
mailing list