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