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