2016-07-06 5 views
0

Мне нужно загрузить данные из файла csv или листа excel (с строками и столбцами) в двумерный python dict. Например, если данные в листе первенствовать выглядит следующим образом:двумерный python dict с разделяемой памятью

name age gender location 
1 Jim 18 male China 
2 Ross 18 male China 
3 Cara 19 female Japan 
4 Ted 18 male China 

Затем выход питон ДИКТ должен выглядеть следующим образом:

data = { 
    1: {'name': 'Jim', 'age': 18, 'gender': 'male', 'location': 'China'}, 
    2: {'name': 'Ross', 'age': 18, 'gender': 'male', 'location': 'China'}, 
    3: {'name': 'Cara', 'age': 19, 'gender': 'female', 'location': 'Japan'}, 
    4: {'name': 'Ted', 'age': 18, 'gender': 'male', 'location': 'China'} 
} 

Вы можете видеть, что есть много дублирующих Infos в этот 2-й dict (а для реальных данных он имеет такое же условие), поэтому я придумал идею разработки нового dict с общей памятью. Чтобы быть конкретным, в приведенном выше примере, я хочу, чтобы мой 2-d dict сохранял только одну копию {'age': 18, 'gender': 'male', 'location': 'China'} через несколько строк (эти строки не должны быть смежными). Если мы назовем data[1]['age'] и data[2]['age'], он должен выполнить поиск в том же извлеченном маленьком разделенном dict.

Я прочитал исходный код python dict, и я знаю, что python dict сохраняет только указатели на ключи и значения (и обычно для небольших объектов int и string, разные указатели могут указывать на один и тот же объект). Поэтому, когда я хочу сказать, что хочу сохранить только одну копию, я имею в виду одну копию указателей.

Любая идея о том, как проектировать этот dict? Огромное спасибо!!!

EDIT

К сожалению, я забыл упомянуть. Данные в этом 2-d dict будут доступны только для чтения.

+3

Это звучит как очень плохая идея. Если вы измените местоположение Джима, внезапно изменились и Росс и Тед. –

+0

@ Kelvin Извините, я забыл упомянуть. Данные в этом dict будут доступны только для чтения :) –

+3

Если между этими людьми не существует встроенного совместно используемого компонента, это звучит так, как вы хотите [алгоритм сжатия] (https://en.wikipedia.org/wiki/ Сжатие данных). Обратите внимание, что в принципе это сделает доступ к элементам в словаре медленнее - компромисс между пространством и скоростью. –

ответ

1

Я думаю, вы спрашиваете о решении для сжатия данных, которое затем должно учитывать как размеры памяти, так и использование ссылок. Наименьший объем памяти обычно принадлежит целому числу, которое должно быть как минимум меньше, чем ссылка на память, поэтому я бы попытался отобразить все в целые числа, если это не слишком неудобно. Кроме того, списки меньше словарей и позволяют прямое индексирование.

Вот альтернативная реализация, что может вызвать некоторые идеи:

import sys 

data = { 
    1: {'name': 'Jim', 'age': 18, 'gender': 'male', 'location': 'China'}, 
    2: {'name': 'Ross', 'age': 18, 'gender': 'male', 'location': 'China'}, 
    3: {'name': 'Cara', 'age': 19, 'gender': 'female', 'location': 'Japan'}, 
    4: {'name': 'Ted', 'age': 18, 'gender': 'male', 'location': 'China'} 
} 

In [43]: sys.getsizeof(data) 
Out[43]: 280 # bytes 

data_list = [ 
    ('Jim', 18, 0, 'CH'),  # 'CH' => 'China' 
    ('Ross', 18, 0, 'CH'), # 0 => Female, 1 => Male 
    ('Cara', 19, 1, 'JP'), # 'JP' => 'Japan' 
    ('Ted', 18, 0, 'CH') 
] 


In [44]: sys.getsizeof(data_list) 
Out[44]: 104 # bytes 

_name, _age, _gender, _location = 0, 1, 2, 3 

In [45]: data_list[2][_age] # access as 2D array instead of 2-level dict 
Out[45]: 19 

Раствор выше будет немного медленнее, но дают некоторые преимущества для больших строк. Использование ссылок, вероятно, не спасет вас, если каждая запись не начнет затягиваться. Наконец, если вы замените все значения целыми числами вместо строковых имен и кодов стран, вы скомбинируете их с помощью списков Python.

Если вы действительно хотите получить в выборе цифровые коды, которые дают лучшее сжатие, смотрите в Хаффмана, например, этот сайт: http://www.geeksforgeeks.org/greedy-algorithms-set-3-huffman-coding

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

  • Нет связанных вопросов^_^