2013-05-11 1 views
1

ВведениеКак избежать штрафа травильных в Dict против засолки список

У меня есть словарь в следующем формате:

dict_list = {'S0':[[list of int],[list of int]], 'S1':[[list of int],[list of int]], ...} 

со списком S0 о Интс доступ через

dict_list['S0'][0] and dict_list['S0'][1] 

Чтобы улучшить читаемость кода, я изменил «список списка» на «dict of list» следующим образом:

dict_dict = {'S0': {'list0': [list of int], 'list1': [list of int]}, ...} 

, что приводит к более читаемый код при доступе списки:

dict_dict['S0']['list0'] and dict_dict['S0']['list1'] 

Рассол Проблемные

Однако, когда я маринованные и спас dict_dict в файл, то получается наказание наличие дополнительных ключей dict фактически масштабируется пропорционально количеству записей «S #». Кажется, что рассол не хранит диктовку «умно», поскольку он хранит каждую диктофон отдельно.

Теперь мы понимаем, что это, в конце концов, то, как рассол должен работать, поскольку каждый «S #» мог иметь разные наборы ключей для начала. Невозможно заранее понять, что наш dict_dict - это просто таблица с регулярно повторяющимися полями.

Вопрос

Мой вопрос, есть ли альтернатива dict_list, в котором список Интс можно получить с помощью строкового ключа (как в dict_dict), но без рассола штрафа, описанного выше?

UPDATE: Эксперименты на основе Комментарии Учитывая

3,100 bytes - dict_list['S0'][0] (list.bin) 
3,314 bytes - dict_dict['S0']['list0'] (dict.bin) 
3,922 bytes - dict_class['S0'].list0 (class.bin) 
5,855 bytes - dict_namedtuple['S0'].list0 (namedtuple.bin) 

s_list = ['S0','S1','S2','S3','S4','S5','S6','S7','S8','S9','S10','S11','S12','S13','S14','S15','S0a','S1a','S2a','S3a','S4a','S5a','S6a','S7a','S8a','S9a','S10a','S11a','S12a','S13a','S14a','S15a','AA0','AA1','AA2','AA3','AA4','AA5','AA6','AA7','AA8','AA9','AA10','AA11','AA12','AA13','AA14','AA15','AA0a','AA1a','AA2a','AA3a','AA4a','AA5a','AA6a','AA7a','AA8a','AA9a','AA10a','AA11a','AA12a','AA13a','AA14a','AA15a','BB0','BB1','BB2','BB3','BB4','BB5','BB6','BB7','BB8','BB9','BB10','BB11','BB12','BB13','BB14','BB15','BB0a','BB1a','BB2a','BB3a','BB4a','BB5a','BB6a','BB7a','BB8a','BB9a','BB10a','BB11a','BB12a','BB13a','BB14a','BB15a'] 
num_of_s_entries = 32 
list_length = 5 

def pickle_n_save(dict_var, filename): 
    outfile = open(filename, "wb") 
    pickle.dump(dict_var, outfile) 
    outfile.close() 

# ------------------------------------------------------------dict_list['S0'][0] 
dict_list = {} 
for s in s_list[0:num_of_s_entries]: 
    dict_list[s] = [[],[]] 
    for pts in range(0,list_length): 
     dict_list[s][0].append(randrange(1,100)) 
     dict_list[s][1].append(randrange(1,100)*1000) 

pickle_n_save(dict_list, "list.bin") 

# -----------------------------------------------------dict_dict['S0']['list0'] 
dict_dict = {} 
for s in dict_list.keys(): 
    dict_dict[s] = {} 
    dict_dict[s]['list0'] = dict_list[s][0] 
    dict_dict[s]['list1'] = dict_list[s][1] 

pickle_n_save(dict_dict, "dict.bin") 

# -------------------------------------------------------dict_class['S0'].list0 
class S: 
    def __init__(self, list0, list1): 
     self.list0 = list0 
     self.list1 = list1 

dict_class = {} 
for s in dict_list.keys(): 
    dict_class[s] = S(dict_list[s][0],dict_list[s][1]) 

pickle_n_save(dict_class, "class.bin") 

# ---------------------------------------------------dict_namedtuple['S0'].list0 
S_namedtuple = namedtuple('S_namedtuple', ['list0','list1']) 
dict_namedtuple = {} 
for s in dict_list.keys(): 
    dict_namedtuple[s] = S_namedtuple(dict_list[s][0],dict_list[s][1]) 

pickle_n_save(dict_namedtuple, "namedtuple.bin") 
+1

Я действительно не вижу, как использование '' list1'' в качестве ключа является более читаемым или лучше, чем просто использовать '1' в качестве индекса списка. – BrenBarn

+1

Я не знаю, но я предпочитаю использовать «даты» и «человек» в качестве ключей, а не помню, что 0 для «дат», а 1 для «человека». – silvernightstar

+1

Почему бы не использовать класс, имеющий «даты» и «человек» в качестве атрибутов? Это также добавляет штраф? –

ответ

3

Может быть, вы хотите namedtuple?

+0

Спасибо за предложение. Я попытался использовать namedtuple (код, показанный в разделе UPDATED исходного вопроса). Вы видите какие-либо проблемы с моей реализацией? – silvernightstar

+0

Кажется разумным. – Amber

Смежные вопросы