2016-09-04 3 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]] 
    } 
} 

파이썬의 (가) 오른쪽 경로에있을 듯 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]) 

, 두 모델의 현재 사전을 얻거나 그 DICT와 다음, 새로운 빈 딕셔너리와 키를 생성하거나 검색 해당 색상 목록 또는 비어있는 새 목록 키를 누른 다음 그리스트에이 요소 목록으로 연도와 월 추가 설정 ...

당신에게 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]]}} 
다음

는 데이터에 적용되는 데이터 구조의 일반 버전입니다
관련 문제