[Python-ideas] matrix operations on dict :)

Terry Reedy tjreedy at udel.edu
Tue Feb 7 04:20:14 CET 2012


On 2/6/2012 8:00 PM, julien tayon wrote:

> Lets define the notion of dict(dict()) (rooted k-ary trees) as a
> vector. Imagine :
> tree A
> { a:
>      { b : 1,
>        c : 2
>      },
>    e : 3.0
> }
>
> This is the same as
> vector B
> dict(
>   tuple([ 'a', 'b' ]) = 1,
>   tuple([ 'a', 'c' ]) = 2,
>   tuple([ e ]) = 3.0
> )

Adding quotes makes it different from tree A. The difference is 
important because a dict simulates a (sparse) array only if the keys are 
ordered (or are ordered sequences of ordered objects). Strings are 
ordered, but not general objects.

There is no need to write tuples as tuple(somelist)
dict(
   ('a', 'b') = 1
   ('a', 'c') = 2
   ('e',) = 3.0
)

Since your definitions of + and * on dicts does not use order, using the 
terms 'vector' and 'matrix' just seem distracting to me. The only thing 
you are extracting from them is the idea of component-wise operations on 
collections. What is important is whether the operations apply to the 
*values*.

Whenever one has a dict whose values are lists, it is common to start 
with empty lists and add items to the list for each key with
    d[key].append(val)
You could imagine this operation as performing your dict addition
    d + {key:[val]}
in place and then performing standard list addition in place (.extend).
But thinking this way has limited use.

In actual application, the code is likely to be something like:
   for key,val in source:
     d.get(key,[]).append(val)

There are three points here.
1. These patterns are specific to subcategories of dicts.
2. For dicts (and sets and lists), in-place modification is more common 
than creating new dicts (or sets or lists). Python is not mathematics, 
and it is not a functional, side-effect-free language.
3. The source of modifiers is usually an iterator -- a category rather 
than a class. The iterator does not have to be based on a dict and 
typically is not.

The same points apply to lists. list1 + list2 is rare compared to 
list1.append(item) and list1.extend(iterable_of_items). And of course, 
both apply to all lists and objects and iterables, rather than 
specialized subcategories.

-- 
Terry Jan Reedy




More information about the Python-ideas mailing list