Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从多维列表创建字典而不复制键_Python_Dictionary_Defaultdict - Fatal编程技术网

Python 从多维列表创建字典而不复制键

Python 从多维列表创建字典而不复制键,python,dictionary,defaultdict,Python,Dictionary,Defaultdict,我想获取一个包含多个元素的元组列表,并将其转换为一个多维字典,而无需重复键。因此,如果以下是我的原始列表: myList = [('jeep', 'red', 2002, 4), ('jeep', 'red', 2003, 6), ('jeep', 'blue', 2003, 4), ('bmw', 'black', 2015, 8)] 我想将上述内容转换成以下格式的词典: {'jeep': {'red': [ [2002, 4], [2003, 6]]

我想获取一个包含多个元素的元组列表,并将其转换为一个多维字典,而无需重复键。因此,如果以下是我的原始列表:

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

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])
对于
myList
中的每个项目,获取模型的当前字典或使用新的空目录创建键,然后使用该目录检索该颜色的列表,或使用新的空列表设置键,然后将年份和月份作为2元素列表附加到该列表中

为您提供
d

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

由于您需要的基本上是一个具有一定级别的树数据结构,其中包含叶列表,因此我将通过将详细信息封装在自定义字典子类中来更明确地说明这一点,因为这样可以使转换非常简单

以下是应用于数据的数据结构的通用版本:

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)