我需要将csv文件或excel表(包含行和列)中的数据加载到二维python dict中。例如,如果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'}
}
你可以看到这个2-d dict中有很多重复的信息(对于真实数据,它具有相同的条件),所以我想出了开发一个带共享内存的新dict的想法。具体来说,在上面的例子中,我希望我的2-d dict只在多行中保存{'age': 18, 'gender': 'male', 'location': 'China'}
的一个副本(这些行不需要相邻)。如果我们调用data[1]['age']
和data[2]['age']
,它应该在相同的提取的小共享字典中进行查找。
我已经阅读了python dict的源代码,我知道python dict只保存指向键和值的指针(通常对于小的int和string对象,不同的指针可能指向同一个对象)。所以,当我的意思是我只想保存一份副本时,我指的是指针的一个副本。
有关如何设计此词典的任何想法?非常感谢!!!
修改
抱歉,我忘了提及。这个2-d dict中的数据是只读的。答案 0 :(得分: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列表进行相当多的压缩。
如果您真的想选择能够提供最佳压缩效果的数字代码,请查看Huffman Coding,例如此网站:http://www.geeksforgeeks.org/greedy-algorithms-set-3-huffman-coding