Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python稀疏字典/重复值_Python_Dictionary_Optimization_Key - Fatal编程技术网

Python稀疏字典/重复值

Python稀疏字典/重复值,python,dictionary,optimization,key,Python,Dictionary,Optimization,Key,我有一本非常非常大的字典。值通常是相同的,似乎应该有一种方法通过引用相同的字典值来减小大小 目前,我使用“值是否具有同义词”的两次传递方法,然后是同义词的查找值 但在理想情况下,有一种方法可以一次性做到这一点是非常棒的 animals = { 'cat':{'legs':4,'eyes':2}, 'dog':{'legs':4,'eyes':2}, 'spider':{'legs':8,'eyes':6}, } 我可以用一个值“哺乳动物”来表示“猫”:

我有一本非常非常大的字典。值通常是相同的,似乎应该有一种方法通过引用相同的字典值来减小大小

目前,我使用“值是否具有同义词”的两次传递方法,然后是同义词的查找值

但在理想情况下,有一种方法可以一次性做到这一点是非常棒的

    animals = {
    'cat':{'legs':4,'eyes':2},
    'dog':{'legs':4,'eyes':2},
    'spider':{'legs':8,'eyes':6},
     }
我可以用一个值“哺乳动物”来表示“猫”:哺乳动物,但我希望能做到的是“狗”:动物['cat']

因为作为参考,它应该占用更少的内存,这是目标


我正在考虑用一个类来处理这个问题,但我不是第一个认为字典中的重复值可能会被“压扁”的人,我更愿意用最符合python的方式来处理它。

我认为对象和继承是做你想做的事情的更好的方式,也许除了内存方面的考虑

要使用引用而不是复制每个字典的值,可以使用ctypes模块:

import ctypes
animals = {'cat':{'legs':4,'eyes':2},'spider':{'legs':8,'eyes':6}}
# You put the value of animals['cat'] in ['dog']
animals['dog'] = id(animals['cat'])
animals
{'dog': 47589527749808, 'spider': {'eyes': 6, 'legs': 8}, 'cat': {'eyes': 2, 'legs': 4}}
# You can access to ['dog'] with
ctypes.cast(animals['dog'], ctypes.py_object).value
{'eyes': 2, 'legs': 4}
不确定这是否是“最具Python风格的方式”,顺便说一句,Imho类是实现这一点的正确方式


另一种方法是使用。关于这一点我知道的不多,看看这一点和其他关于使用引用的提示的不同答案。

这至少有助于思考我可能如何做到这一点。我从一个潜在值字典和一个带有字符串的键字典开始,字符串指向潜在值的dict。这需要使用字典查找,而存储字符串会削弱一些内存优势。我将学习一些关于CTypes的知识,也许我可以将我的解决方案和你的解决方案进行某种混合-谢谢