2012-05-18 2 views
0

У меня есть список имен файлов, эксперименты = ['f1', 'f2', 'f3', 'f4'], время суток, t = ['am' , 'pm'] и типы собранных данных, ['temp', 'влажность'].python Как создавать словари в словарях из списков

Из них я хочу создать словари внутри словарей в следующем формате:

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': []}}} 

Какой самый лучший способ сделать это? Большое спасибо в продвинутом виде.

ответ

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

Следует отметить, что Dict постижения были введены в Python 2.7 – Will

+0

Совершенно верно, спасибо для добавления этой информации. Я сам поймал это, когда был вынужден использовать Python 2.6. –

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) 

или лучше ДИКТ понимание пути (питон 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() Ing.

+2

«py3k way» также работает в версии 2.7. –

+0

истинно ... мы живем в fuuutuuure! –

+2

Разве это не совместное использование одинаковых 'datatypes_dict' и' times_dict'? например, 'experimental_dict ['f1'] ['am'] ['temp']. append (25)', вероятно, не работает, поскольку OP ожидает –

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 
[]