invert dictionary with list &c

Anton Vredegoor anton at vredegoor.doge.nl
Sat Nov 29 01:05:41 EST 2003


anton muhin <antonmuhin.REMOVE.ME.FOR.REAL.MAIL at rambler.ru> wrote:

>However, if you insist on one-liners, I can suggest some ;):
>
>def count(l):
>   return reduce(
>     lambda d, e: (d.update(dict([(e, d.get(e, 0) + 1)])), d)[1],
>     l, {}
>   )
>
>def invert(d):
>   return reduce(
>     lambda d, (k, v): (d.update(dict([(v, d.get(v, []) + [k])])), d)[1],
>     d.iteritems(), {}
>   )
>
>(given in several lines, but can be written in one)
>
>or even
>
>count = lambda l: reduce(
>     lambda d, e: (d.update(dict([(e, d.get(e, 0) + 1)])), d)[1],
>     l, {}
>)
>
>:)

Is big bot not watching? Then:

def invert(D):
    return reduce(lambda d,(k,v): 
        d.setdefault(v,[]).append(k) or d,D.iteritems(),{})

def count(L):
    return reduce(lambda d,v:
        d.__setitem__(v,d.get(v,0)+1) or d,L,{})

def test():
    print count('aabbbbcc')
    print invert({'A': 'a', 'B': 'b', 'C': 'a'})
    print count("yes yes no".split())
    
if __name__=='__main__':
    test()

"""
{'a': 2, 'c': 2, 'b': 4}
{'a': ['A', 'C'], 'b': ['B']}
{'yes': 2, 'no': 1} """

Anton




More information about the Python-list mailing list