【问题标题】:How to convert tuple to a multi nested dictionary in python?如何在python中将元组转换为多嵌套字典?
【发布时间】:2014-03-17 02:41:36
【问题描述】:

我有一个格式如下的元组:

(639283, 298290710, 1385)
(639283, 298290712, 1389)
(639283, 298290715, 1395)
(745310, 470212995, 2061)
(745310, 470213821, 3713)
(745310, 470215360, 6791)
(745310, 470215361, 6793)
(745310, 470215363, 6797)
(911045, 374330803, 4905)
(911045, 374330804, 4907)
(911045, 374330807, 4913)
(911045, 374330808, 4915)
(911045, 374330809, 4917)

我想转换成这样的嵌套字典:

{639283:{298290710:1385, 298290712:1389, 298290715:1395},745310:{470212995:2061,470213821:3713}............}

有没有一种pythonic的方式来做到这一点?这似乎很简单,但我似乎无法弄清楚。

【问题讨论】:

    标签: python python-2.7 dictionary tuples


    【解决方案1】:

    您可以将元组解包与collections.defaultdict 结合使用,让您的生活更轻松。

    创建一个外部defaultdict,并将dict 作为其默认值。然后,您可以简单地遍历您的元组列表一次,并在执行过程中适当地设置值。

    from collections import defaultdict
    
    d = defaultdict(dict) # dict where the default values are dicts.
    for a, b, c in list_of_tuples: # Each tuple is "key1, key2, value"
        d[a][b] = c
    

    当然,您可能更了解这些值实际代表的含义,因此您可以为您的字典和各个项目提供比 abc 和 @987654329 更好、更具描述性的名称@。

    【讨论】:

    • 我认为这两种反应都很棒,但这似乎相当直观和干净。所以,我接受这个:)
    【解决方案2】:

    您可以使用 itertools.groupby 根据第一项对元组进行分组,然后在 dict-comprehension 中迭代这些组以获得所需的结果。

    >>> from operator import itemgetter
    >>> from pprint import pprint
    >>> from itertools import groupby
    >>> d = {k: dict(x[1:] for x in g) for k, g in groupby(data, key=itemgetter(0))}
    >>> pprint(d)
    {639283: {298290710: 1385, 298290712: 1389, 298290715: 1395},
     745310: {470212995: 2061,
              470213821: 3713,
              470215360: 6791,
              470215361: 6793,
              470215363: 6797},
     911045: {374330803: 4905,
              374330804: 4907,
              374330807: 4913,
              374330808: 4915,
              374330809: 4917}}
    

    data 是您的元组列表或元组的元组。

    【讨论】:

      猜你喜欢
      • 2021-06-14
      • 1970-01-01
      • 2022-06-14
      • 2013-12-07
      • 2017-01-20
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多