如何将元组转换为python中的多重嵌套字典?
问题描述:
我有以下格式的元组:如何将元组转换为python中的多重嵌套字典?
(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}............}
是否有这样做的Python的方式?这似乎很简单,但我似乎无法弄清楚这一点。
答
您可以使用tuple拆箱与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
当然,你大概知道更多关于这些值实际上代表了,所以你可以给你的字典,以及个别项目,更好,更具描述性的名称不a
,b
,c
和d
。
答
您可以使用itertools.groupby
根据第一项对元组进行分组,然后在字典理解中对这些组进行迭代以获得所需的结果。
>>> 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
是您的元组元组或元组列表。
我认为这两种反应都很棒,但这看起来相当直观和干净。所以,我接受这:) – msakya