<div dir="auto"><div><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Mar 21, 2019, 10:15 PM Steven D'Aprano <<a href="mailto:steve@pearwood.info">steve@pearwood.info</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">What would be the most useful behaviour for dict "addition" in your <br>
opinion?<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">Probably what I would use most often was a "lossless" merging in which duplicate keys resulted in the corresponding value becoming a set containing all the merged values. E.g.</div><div dir="auto"><br></div><div dir="auto">>>> d1 = {1: 55, 2: 77, 3: 88}</div><div dir="auto">>>> d2 = {3: 99, 4: 22}</div><div dir="auto">>>> add(d1, d2)</div><div dir="auto">{<span style="font-family:sans-serif">1: 55, 2: 77, 3: {88, 99}, 4:22}</span></div><div dir="auto"><br></div><div dir="auto">I'm sure most users would hate this too. It changes the type of values between a thing and a set of things, and that has to be sorted out downstream. But it is lossless in a similar way to Counter or sequence addition.</div><div dir="auto"><br></div><div dir="auto">I can write what I want perfectly well. Perhaps useing defaultdict as a shortcut to get there. And I know there are some behaviors I have not specified here, but my function can do whatever I want in the edge cases.</div><div dir="auto"><br></div><div dir="auto">If we're to see 'd1 + d2' for the first time without having followed this discussion, my guess would be behavior similar to what I show.</div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">> Of course I could learn it and teach it, but it will always feel<br>
> like a wart in the language.<br>
<br>
Would that wartness be lessoned if it were spelled | or << instead?<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">Yes, definitely. Both those spellings feel pretty natural to me. They don't have the misleading associations '+' carries. I'm kinda fond of '<<' because it visitation resembles an arrow that I can think of as "put the stuff here into there".</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">> In contrast, once you tell me about the special object "vectorised arrays",<br>
> `arr1 + arr2` does exactly what is expect in NumPy.<br>
<br>
I don't know Numpy well enough to know whether that is elementwise addition or concatenation or something else, so that example doesn't resonate with me. I can't guess what you expect, and I have no confidence that my guess (matrix addition of equal-sized arrays, an exception if unequal) will be what Numpy does<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">Fair enough. I've worked with NumPy long enough that perhaps I forget what my first intuition was. I accept that it's non-obvious to many users.</div><div dir="auto"><br></div><div dir="auto">FWIW, I really love NumPy behavior, but it's a shift in thinking vs lists. E.g.</div><div dir="auto"><br></div><div dir="auto">>>> a = array([1, 2, 3])</div><div dir="auto">>>> b = array([[10, 11, 12], [100, 200, 300]])</div><div dir="auto">>>> a + b</div><div dir="auto">[[  11   13   15 ]</div><div dir="auto"> [ 101 202 303]]</div><div dir="auto"><br></div><div dir="auto">This is "broadcasting" of compatible shapes.</div></div>