如何在python中将元组转换为多嵌套字典?

时间:2014-02-17 17:13:16

标签: python python-2.7 dictionary tuples

我有以下格式的元组:

(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方法吗?看起来很简单,但我似乎无法弄清楚这一点。

2 个答案:

答案 0 :(得分:10)

您可以使用元组拆包与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

当然,您可能更了解这些值实际代表什么,因此您可以为您的词典和单个项目提供比ab,{{1更好,更具描述性的名称}和c

答案 1 :(得分:8)

您可以使用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是元组或元组元组的列表。