Converting List of 3 Element Tuple to Dictionary

后端 未结 3 1474
情书的邮戳
情书的邮戳 2021-01-05 02:31

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)]

相关标签:
3条回答
  • 2021-01-05 03:18

    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.

    0 讨论(0)
  • 2021-01-05 03:29

    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.

    0 讨论(0)
  • 2021-01-05 03:31

    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]}
    
    0 讨论(0)
提交回复
热议问题