# [Python-ideas] matrix operations on dict :)

julien tayon julien at tayon.net
Tue Feb 7 11:45:04 CET 2012

2012/2/7 Terry Reedy <tjreedy at udel.edu>:
>
> 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*.

I have checked I can go back and forth without problem. but oky I
forgot the quote in A. I know it may have been disturbing, and I
apologize.

Well, order in actual notation is a commodity for not repeating the
dimension's name.
it's easier to write [ 1 , 2, 3 ] then to always repeat [ x = 1, y =
2, z = 3 ] I am just going back to the basis.

Our disagreement mainly comes from me forgetting the quote in A.

>
> In actual application, the code is likely to be something like:
>  for key,val in source:
>    d.get(key,[]).append(val)
>
It does not propagate recursively though.
so adding d1 =  { 'a' , { 'b' , { 'c' : 1 } , 'd' : 2 } with d2 =   {
'a' , { 'b' , { 'c' : 2 } , 'd' : 1 } wont work with yout example,
but will work with my definition of d1 + d2.

> There are three points here.
> 1. These patterns are specific to subcategories of dicts.
It has sense too for non scalar value, it was  just already tough
trying to explain with scalars, so I limited myself to the simple
case.

> 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.

I just have to switch a Flag in the matrix operator to make it operate
in place. I was not sure wich option was best.

> 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.

well, you are definitely right on this point.

>
> 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.

I also provide an iterator in the form [ ( (path_tovalue), value ), ... ] ^_^

since it does recursive calls, I don't like it, and I try not to make
it too obvious.

Cheers,
Julien