Zipping a dictionary whose values are lists

Peter Otten __peter__ at web.de
Thu Apr 12 12:42:38 EDT 2012


tkpmep at gmail.com wrote:

> I using Python 3.2 and have a dictionary
>>>> d = {0:[1,2], 1:[1,2,3], 2:[1,2,3,4]}
> 
> whose values are lists I would like to zip into a list of tuples. If I
> explicitly write:
>>>> list(zip([1,2], [1,2,3], [1,2,3,4])
> [(1, 1, 1), (2, 2, 2)]
> 
> I get exactly what I want. On the other hand, I have tried
> 
>>>>list(zip(d))
> [(0,), (1,), (2,)]
> 
>>>> list(zip(d.values()))
> [([1, 2],), ([1, 2, 3],), ([1, 2, 3, 4],)]
> 
>>>> list(zip(d[i] for i in d))
> [([1, 2],), ([1, 2, 3],), ([1, 2, 3, 4],)]
> 
>>>> list(zip(*d))
> Traceback (most recent call last):
>   File "<pyshell#48>", line 1, in <module>
>     list(zip(*d))
> TypeError: zip argument #1 must support iteration
> 
> and nothing quite works. What am I doing wrong?

You have all the building blocks ;)

>>> d = {0:[1,2], 1:[1,2,3], 2:[1,2,3,4]}
>>> list(zip(*d.values()))
[(1, 1, 1), (2, 2, 2)]

The order of the values is undefined, so you may want to sort the lists by 
key first:

>>> list(zip(*[v for k, v in sorted(d.items())]))
[(1, 1, 1), (2, 2, 2)]

Well, I guess it doesn't really matter for that example...




More information about the Python-list mailing list