2014-02-17 37 views
8

我有以下格式的元組:如何將元組轉換爲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的方式?這似乎很簡單,但我似乎無法弄清楚這一點。

回答

9

您可以使用tuple拆箱與collections.defaultdict結合使您的生活更輕鬆。

創建外部defaultdictdict作爲其默認值。然後,您可以簡單地遍歷一次元組列表,隨時設置適當的值。

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 

當然,你大概知道更多關於這些值實際上代表了,所以你可以給你的字典,以及個別項目,更好,更具描述性的名稱不abcd

+1

我認爲這兩種反應都很棒,但這看起來相當直觀和乾淨。所以,我接受這:) – msakya

7

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

相關問題