# inverting a dictionary of lists

Discussion in 'Python' started by bpowah@gmail.com, Jun 15, 2007.

1. ### Guest

I searched for an hour and don't see a solution to this (i assume
somewhat common) problem.

I have a very large dictionary of lists:
d = {a:[1,2], b:[2,3], c:[3]}
and i want to reverse the associativity of the integers thusly:
inverse(d) makes {1:[a], 2:[a,b], 3:[b,c]}

my solution expands the original dict into two lists of keys and list
elements:
list1: [a,a,b,b,c]
list2: [1,2,2,3,3]
then recombines them with the reverse operation.

but this takes too much time and a lot of memory.
I wonder if anyone can point me to a more efficient solution?

, Jun 15, 2007

2. ### Gabriel GenellinaGuest

En Fri, 15 Jun 2007 00:20:33 -0300, <> escribiÃ³:

> I searched for an hour and don't see a solution to this (i assume
> somewhat common) problem.
>
> I have a very large dictionary of lists:
> d = {a:[1,2], b:[2,3], c:[3]}
> and i want to reverse the associativity of the integers thusly:
> inverse(d) makes {1:[a], 2:[a,b], 3:[b,c]}
>
> my solution expands the original dict into two lists of keys and list
> elements:
> list1: [a,a,b,b,c]
> list2: [1,2,2,3,3]
> then recombines them with the reverse operation.
>
> but this takes too much time and a lot of memory.
> I wonder if anyone can point me to a more efficient solution?

py> d = dict(a=[1,2], b=[2,3], c=[3])
py> result = {}
py> for k,v in d.iteritems():
.... for item in v:
.... result.setdefault(item, []).append(k)
....
py> result
{1: ['a'], 2: ['a', 'b'], 3: ['c', 'b']}
py>

You may use collections.defaultdict too - search some recent posts.

--
Gabriel Genellina

Gabriel Genellina, Jun 15, 2007

3. ### Raymond HettingerGuest

On Jun 14, 8:20 pm, wrote:
> I have a very large dictionary of lists:
> d = {a:[1,2], b:[2,3], c:[3]}
> and i want to reverse the associativity of the integers thusly:
> inverse(d) makes {1:[a], 2:[a,b], 3:[b,c]}

Try using setdefault:

>>> d = {'a':[1,2], 'b':[2,3], 'c':[3]}
>>> r = {}
>>> for k in d:

for e in d[k]:
r.setdefault(e, []).append(k)

>>> r

{1: ['a'], 2: ['a', 'b'], 3: ['c', 'b']}

Raymond

Raymond Hettinger, Jun 15, 2007