python如何从列表中创建字典中的字典

时间:2012-05-18 04:16:30

标签: python list dictionary-comprehension

我有一个文件名列表,examples = ['f1','f2','f3','f4'],一天中的时间,t = ['am','pm']和类型收集的数据,['temp','湿度']。

从这些我希望以下列格式在词典中创建词典:

dict = {'f1': { am : {'temp': [], 'humidity': []} , pm : {'temp': [], 'humidity': []}},
        'f2': { am : {'temp': [], 'humidity': []} , pm : {'temp': [], 'humidity': []}},
        'f3': { am : {'temp': [], 'humidity': []} , pm : {'temp': [], 'humidity': []}},
        'f4': { am : {'temp': [], 'humidity': []} , pm : {'temp': [], 'humidity': []}}}

最好的方法是什么?非常感谢先进。

3 个答案:

答案 0 :(得分:5)

{z: {y: {x: [] for x in data_types} for y in t} for z in experiments}

答案 1 :(得分:2)

如果我见过,就会有一个理解的案例。

from copy import deepcopy
datatypes = ['temp','humidity']
times = ['am','pm']
experiments = ['f1','f2','f3','f4']

datatypes_dict = dict((k, []) for k in datatypes)
times_dict = dict((k, deepcopy(datatypes_dict)) for k in times)
experiments_dict = dict((k, deepcopy(times_dict)) for k in experiments)

或更好的词典理解方式(python 2.7 +)

datatypes_dict = {k: [] for k in datatypes}
times_dict = {k: deepcopy(datatypes_dict) for k in times}
experiments_dict = {k: deepcopy(times_dict) for k in experiments}

你可以嵌套它们但是如果事情变得复杂的话,它会非常快速。

在这个用例中,@ marshall.ward的回答

{z: {y: {x: [] for x in data_types} for y in t} for z in experiments}

远比我好,因为你可以避免使用deepcopy()。

答案 2 :(得分:1)

以输出格式获得一些艺术许可

>>> from collections import namedtuple, defaultdict
>>> from itertools import product
>>> experiments = ['f1','f2','f3','f4']
>>> times_of_day = ['am','pm']
>>> data_types = ['temp','humidity']
>>> DataItem = namedtuple('DataItem', data_types)
>>> D=defaultdict(dict)
>>> for ex, tod in product(experiments, times_of_day):
...     D[ex][tod]=DataItem([], [])
... 
>>> D
defaultdict(<type 'dict'>, {'f1': {'am': DataItem(temp=[], humidity=[]), 'pm': DataItem(temp=[], humidity=[])}, 'f2': {'am': DataItem(temp=[], humidity=[]), 'pm': DataItem(temp=[], humidity=[])}, 'f3': {'am': DataItem(temp=[], humidity=[]), 'pm': DataItem(temp=[], humidity=[])}, 'f4': {'am': DataItem(temp=[], humidity=[]), 'pm': DataItem(temp=[], humidity=[])}})

您可以访问此类数据项

>>> D['f1']['am'].temp
[]
>>> D['f1']['am'].humidity
[]