vsoler wrote:
On 7 mar, 17:53, Steven D'Aprano <st...@remove-this-
cybersource.com.au> wrote:
On Sun, 07 Mar 2010 08:23:13 -0800, vsoler wrote:
Hello,
My code snippet reads data from excel ranges. First row and first column
are column headers and row headers respectively. After reding the range
I build a dict.
................'A'..............'B'
'ab'............3................5
'cd'............7................2
'cd'............9................1
'ac'............7................2
d={('ab','A'): 3, ('ab','B'): 5, ('cd','A'): 7, ...
However, as you can see there are two rows that start with 'cd', and
dicts, AFAIK do not accept duplicates.
One of the difficulties I find here is that I want to be able to easily
sum all the values for each row key:  'ab', 'cd' and 'ac'. However,
using lists inside dicts makes it a difficult issue for me.

What I need is that sum(('cd','A')) gives me 16, sum(('cd','B')) gives
me 3.

But you really *do* want lists inside the dict if you want to be able to call sum() on them. You want to map the tuple ('cd','A') to the list [7,9] so you can sum the results. And if you plan to sum the results, it's far easier to have one-element lists and just sum them, instead of having to special case "if it's a list, sum it, otherwise, return the value". So I'd use something like

  import csv
  f = file(INFILE, 'rb')
  r = csv.reader(f, ...)
  headers = r.next() # discard the headers
  d = defaultdict(list)
  for (label, a, b) in r:
    d[(label, 'a')].append(int(a))
    d[(label, 'b')].append(int(b))
  # ...
  for (label, col), value in d.iteritems():
    print label, col, 'sum =', sum(value)

Alternatively, if you don't need to store the intermediate values, and just want to store the sums, you can accrue them as you go along:

  d = defaultdict(int)
  for (label, a, b) in r:
    d[(label, 'a')] += int(a)
    d[(label, 'b')] += int(b)
  # ...
  for (label, col), value in d.iteritems():
    print label, col, 'sum =', value

Both are untested, but I'm pretty sure they're both viable, modulo my sleep-deprived eyes.

-tkc




--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to