If I have two List of tuples
tuple2list=[(4, 21), (5, 10), (3, 8), (6, 7)]
tuple3list=[(4, 180, 21), (5, 90, 10), (3, 270, 8), (6, 0, 7)]
If one wants a nested dictionary without overriding the dictionary, could use the defaultdict
from the collections
library.
>>> from collections import defaultdict
>>> # Edited the list a bit to show when overrides
>>> tuple3list=[(4, 180, 21), (4, 90, 10), (3, 270, 8), (6, 0, 7)]
>>> tuple3dict = defaultdict(dict)
>>> for x, y, z in tuple3list:
... tuple3dict[x][y] = z
...
>>> print(tuple3dict)
defaultdict(<class 'dict'>, {4: {180: 21, 90: 10}, 3: {270: 8}, 6: {0: 7}})
>>> tuple3dict[4][90]
10
Unfortunately, one line assignments are tricky or impossible, hence I assume the only valid solution would be this.
In Python2.7 or newer, you could use a dict comprehension:
In [100]: tuplelist = [(4, 180, 21), (5, 90, 10), (3, 270, 8), (4, 0, 7)]
In [101]: tuplelist2dict = {a:{b:c} for a,b,c in tuplelist}
In [102]: tuplelist2dict
Out[102]: {3: {270: 8}, 4: {0: 7}, 5: {90: 10}}
In Python2.6 or older, the equivalent would be
In [26]: tuplelist2dict = dict((a,{b:c}) for a,b,c in tuplelist)
Note that if the first value in the tuples occurs more than once, (as in the example above) the resulting tuplelist2dict
only contains one key-value pair -- corresponding to the last tuple with the shared key.
This pair-case is simple, since it aligns with dict construction:
... the positional argument must be an iterator object. Each item in the iterable must itself be an iterator with exactly two objects. The first object of each item becomes a key in the new dictionary, and the second object the corresponding value.
>>> t = [(4, 21), (5, 10), (3, 8), (4, 7)]
>>> dict(t)
{3: 8, 4: 7, 5: 10}
The triple case could be solved in this way:
>>> t = [(4, 180, 21), (5, 90, 10), (3, 270, 8), (4, 0, 7)]
>>> dict([ (k, [v, w]) for k, v, w in t ])
{3: [270, 8], 4: [0, 7], 5: [90, 10]}
Or a bit more general:
>>> dict([ (k[0], k[1:]) for k in t ]) # hello car, hi cdr
{3: (270, 8), 4: (0, 7), 5: (90, 10)}
Note that your code:
_3_tuplelist_to_dict = {4: {180:21}, 5:{90:10}, 3:{270:8}, 4:{0:7}}
is really just a confusing representation of this:
{3: {270: 8}, 4: {0: 7}, 5: {90: 10}}
Try:
>>> {4: {180:21}, 5:{90:10}, 3:{270:8}, 4:{0:7}} == \
{3: {270: 8}, 4: {0: 7}, 5: {90: 10}}
True
With Python 3, you can use a dict comprehension:
>>> t = [(4, 180, 21), (5, 90, 10), (3, 270, 8), (4, 0, 7)]
>>> {key: values for key, *values in t}
{3: [270, 8], 4: [0, 7], 5: [90, 10]}