[Tutor] Multi-Dimensional Dictionary that contains a 12 element list.
Paul Kraus
pkraus at pelsupply.com
Wed Dec 28 17:13:28 CET 2005
On Wednesday 28 December 2005 10:18 am, Paul Kraus wrote:
> I am trying to build a data structure that would be a dictionary of a
> dictionary of a list.
>
> In Perl I would build the structure like so $dictionary{key1}{key2}[0] = X
> I would iterate like so ...
> foreach my $key1 ( sort keys %dictionary ) {
> foreach my $key2 ( sort keys %{$dictionary{$key1}} ) {
> foreach my $element ( @{$dictionary{$key1}{$key2} } ) {
> print "$key1 => $key2 => $element\n";
> }
> }
> }
>
Here is the code that I used. Its functional and it works but there has got to
be some better ways to do a lot of this. Transversing the data structure
still seems like I have to be doing it the hard way.
The input data file has fixed width fields that are delimited by pipe.
So depending on the justification for each field it will either have leading
or ending whitespace.
TIA,
Paul
<code>
#!/usr/bin/python
#############################
## Paul D. Kraus - 2005-12-27
## parse.py - Parse Text File
## Pipe deliminted '|'
#############################
## Fields: CustCode [0]
## : OrdrType [1]
## : OrdrReturn [2]
## : State [3]
## : QtyShipped [4]
## : VendCode [5]
## : InvoiceDate [7]
#############################
import re
import string
results = {}
def format_date(datestring):
(period,day,year) = map(int,datestring.split('/') )
period += 2
if period == 13: period = 1; year += 1
if period == 14: period = 2; year += 1
if year > 80:
year = '19%02d' % year
else:
year = '20%02d' % year
return (year,period)
def format_qty(qty,credit,oreturn):
qty = float(qty)
if credit == 'C' or oreturn == 'Y':
return qty * -1
else:
return qty
textfile = open('orders.txt','r')
for line in textfile:
fields = map( string.strip, line.split( '|' ) )
fields[4] = format_qty(fields[ 4 ],fields[ 1 ], fields[ 2 ] )
(year, period) = format_date( fields[7] )
for count in range(12):
if count == period:
if results.get( ( year, fields[6], count), 0):
results[ year,fields[6], count] += fields[4]
else:
results[ year,fields[6],count] = fields[4]
sortedkeys = results.keys()
sortedkeys.sort()
for keys in sortedkeys:
res_string = keys[0]+'|'+keys[1]
for count in range(12):
if results.get((keys[0],keys[1],count),0):
res_string += '|'+str(results[keys[0],keys[1],count])
else:
res_string += '|0'
print res_string
</code>
More information about the Tutor
mailing list