我需要将数据从csv文件或Excel工作表(带有行和列)加载到二维python字典中。例如,如果excel工作表中的数据如下所示:
name age gender location
1 Jim 18 male China
2 Ross 18 male China
3 Cara 19 female Japan
4 Ted 18 male China
然后输出的python dict应该看起来像这样:
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'}
}
您可以看到在此二维字典中有很多重复的信息(对于真实数据,它具有相同的条件),因此我想到了一个开发具有共享内存的新字典的想法。具体来说,在上面的示例中,我希望我的二维字典仅保存{'age': 18, 'gender': 'male', 'location': 'China'}
跨多个行的一个副本(这些行不需要相邻)。如果调用data[1]['age']
和data[2]['age']
,它应该在相同的提取的小型共享字典中进行查找。
我已经阅读了python dict的源代码,并且我知道python dict仅保存指向键和值的指针(通常对于小int和string对象,不同的指针可能指向同一对象)。因此,当我只想保存一个副本时,就是一个指针的副本。
关于如何设计此字典的任何想法?非常感谢!!!
编辑
对不起,我忘了提。此二维字典中的数据将是只读的。
我猜您在问有关数据压缩解决方案的问题,该解决方案应同时考虑内存大小和引用的使用。最小的内存占用量通常属于一个整数,该整数应至少与内存引用一样小,因此,我会尝试将所有内容映射为整数,除非它不太方便。而且,列表比字典小,并且可以直接快速索引。
这是一个可能引发一些想法的替代实现:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句