list comprehention

Patrick Maupin pmaupin at gmail.com
Mon Jan 23 18:10:13 EST 2006


Duncan Booth showed how to solve a problem posed by Mathijs.  This is
very similar to Duncan's solution, except I (ab)use setdefault on a
regular basis...

>>> def occurrences(t):
...     res = {}
...     for item in t:
...         res.setdefault(item,[0])[0] += 1
...     return res
...
>>> ref = [2,2,4,1,1]
>>> lst = [2,2,5,2,4]
>>> oref = occurrences(ref)
>>> sum(min(v[0],oref.get(k,[0])[0]) for (k,v) in occurrences(lst).iteritems())
3
>>>

Actually, this brings up an interesting point:

>>> {}.setdefault('foo',0) += 1
SyntaxError: can't assign to function call

I understand why this doesn't work, but it would sure be nice if it
did.  I think somebody was mentioning "mutable ints" at one point,
which is basically what I abuse [0] to provide.  If I were doing a lot
of this in one place, I would code a mutable integer class, and then
the rest of the code would get simpler.

Regards,
Pat




More information about the Python-list mailing list