2016-09-04 7 views
2

複数の要素を持つタプルのリストを取得し、キーを繰り返さずに多次元辞書に変換したいと考えています。したがって、次の場合には、私のオリジナルのリストです:キーを複製せずに多次元リストから辞書を作成

myList = [('jeep', 'red', 2002, 4), ('jeep', 'red', 2003, 6), ('jeep', 'blue', 2003, 4), ('bmw', 'black', 2015, 8)] 

私は上記を取ると、この形式の辞書にそれを回すしたい:

{'jeep': 
    {'red': [ 
     [2002, 4], 
     [2003, 6]] 
    'blue': [ 
     [2003, 4]] 
    }, 
'bmw': 
    {'black': [ 
     [2015, 8]] 
    } 
} 

私はPythonの右側のパス上にあるように見えましたdefaultdict、しかし私は完全にこれを解決するように見えることはできません。ありがとう! dict.setdefaultの多くを使用して

答えて

4

... myList内の各アイテムの

myList = [('jeep', 'red', 2002, 4), ('jeep', 'red', 2003, 6), ('jeep', 'blue', 2003, 4), ('bmw', 'black', 2015, 8)] 

d = {} 
for model, colour, year, month in myList: 
    d.setdefault(model, {}).setdefault(colour, []).append([year, month]) 

、いずれかのモデルの現在の辞書を取得したり、その辞書で、その後、新しい空の辞書を使用してキーを作成する、のいずれかの取得その色のリスト、または新しい空のリストでキーを設定し、そのリストに2要素のリストとして年と月を追加...

はあなたにdを与える:

{'bmw': {'black': [[2015, 8]]}, 
'jeep': {'blue': [[2003, 4]], 'red': [[2002, 4], [2003, 6]]}} 
1

基本的には、葉のリストを持つレベルのある特定の数のツリーデータ構造ですから、カスタム辞書サブクラス内に詳細をカプセル化することで、変換を非常に簡単にすることができるため、 。

class TreeContainer(dict): 
    def __init__(self, max_levels, leaf_factory=lambda: None, level=1): 
     self.max_levels = max_levels 
     self.level = level 
     self.leaf_factory = leaf_factory 

    def __missing__(self, key): 
     if self.level < self.max_levels: # need another level? 
      value = self[key] = type(self)(self.max_levels, self.leaf_factory, 
              self.level+1) 
     else: 
      value = self[key] = self.leaf_factory() 
     return value 

myList = [("jeep", "red", 2002, 4), ("jeep", "red", 2003, 6), 
      ("jeep", "blue", 2003, 4), ("bmw", "black", 2015, 8)] 

vehicles = TreeContainer(2, list) 

for model, color, year, month in myList: # convert list to dictionary 
    vehicles[model][color].append([year, month]) 

from pprint import pprint 
pprint(vehicles) 

出力:

{'bmw': {'black': [[2015, 8]]}, 
'jeep': {'blue': [[2003, 4]], 'red': [[2002, 4], [2003, 6]]}} 
ここ

は、あなたのデータに適用されるデータ構造のジェネリック版です
関連する問題