Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.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逐键访问dict_Python_Dictionary - Fatal编程技术网

python逐键访问dict

python逐键访问dict,python,dictionary,Python,Dictionary,我使用自定义类的实例(类似于带有一堆额外内容的2D向量)作为dict键。 它使用自定义的hash和equals魔术方法,基本上使它等于具有初始化数据的元组 我正在处理的数据集非常大,内存(RAM)是一个主要问题,我需要多个不同的数据结构,使用相同的自定义对象实例作为键 我想要访问dict键的实际引用 如果我可以从初始化数据的元组中获得dict键,我就可以防止不同的自定义类实例在不同的数据结构中使用相同的内部数据,而是使用相同的实例 可能吗?如果是,怎么做 例如: dict1 = {} dict2

我使用自定义类的实例(类似于带有一堆额外内容的2D向量)作为dict键。
它使用自定义的hash和equals魔术方法,基本上使它等于具有初始化数据的元组

我正在处理的数据集非常大,内存(RAM)是一个主要问题,我需要多个不同的数据结构,使用相同的自定义对象实例作为键

我想要访问dict键的实际引用

如果我可以从初始化数据的元组中获得dict键,我就可以防止不同的自定义类实例在不同的数据结构中使用相同的内部数据,而是使用相同的实例

可能吗?如果是,怎么做

例如:

dict1 = {}
dict2 = {}
一个代码段:

v = MyVect(1,5,"data",True)
dict1[v] = ("important", "data")
第二部分:
(此部件只能访问用于创建
MyVect
的数据,但没有实际参考。)

因此,我将节省几乎一半的内存。

这只是为了设置程序稍后使用的初始数据结构。

实际上,您想要做的是控制
MyVect
实例的创建,以便对于给定的初始化数据集,只创建一个
MyVect
实例

我建议在
MyVect
类上使用一个静态方法,它将跟踪已创建的类的所有实例

class MyVect(object):

    instances = {}

    @staticmethod
    def get_instance(*args):
        instance = MyVect.instances.get(args)
        if instance is None:
            MyVect.instances[args] = instance = MyVect(*args)
        return instance

    def __init__(*args):
        # Memory intensive initialization here
我建议将工厂方法签名与类构造函数的签名相匹配。我还使用一个简单的dict作为缓存,输入初始参数,但您可以根据您的性能要求对其进行调整,使其更合适

当需要创建一个新密钥来访问数据时,可以使用factory方法获取
MyVect
实例

keydata_without_reference = (1,5,"data",True)
mykey = MyVect.get_instance(*keydata_without_reference)
dict2[mykey] = "some other data"

在对方法和属性(如C++、java等)的访问控制的语言中,您可以将类构造函数设置为<强>私有> /强>,这将强制调用代码使用工厂方法来获取实例并避免任何问题。在Python中,这是不可能的,因此您必须小心不要直接调用构造函数。

您偶尔在术语上的更改有点令人困惑,但代码帮助很大。例如,没有“2D向量”(即矩阵)这样的东西,您的代码只使用简单的4元组。。。是什么阻止您使用相同的向量为每个dict(数据结构)设置关键帧?Python字典为您提供自己的哈希功能。我不知道如何更好地表达它,但您似乎不明白我要解释的内容。我的意思是“向量”一词,不象C++向量,或多或少转化为一个Python列表(动态数组),但就像一个在游戏中使用的数学向量。它是一个对象,数据指向一个独特的点在模拟环境中。所以ofc它只是一组数据,你也可以用元组来表示,但是元组不能用方法等来表示一个状态。另一件事似乎我必须澄清。示例代码的第二部分无法访问包含对象实例的“v”变量。它只能访问创建与所需实例匹配的MyVect实例所需的数据;这就解释了我错过了什么。在这种情况下,我认为@jstlaurent满足了您的需要。谢谢,这是一个解决方案,但它需要大量重构,因为它是一个工作项目,出乎意料地超出了最初实现的限制。顺便说一句,由于团队规模较小,私有注释构造函数不应该是一个问题。我想你有点误解了我的问题,但你的答案是正确的。这里有很多MyVect实例,而不仅仅是一些包含大量数据的实例。我将等待答案,接受一两天的其他答案,因为我仍然希望有一个更容易重构的解决方案。你是对的,我不确定我是否理解你在试图做什么。您希望MyVect的实例更少,对吗?您拥有很多这样的数据集,是因为您拥有一组给定初始化数据的多个实例,还是因为您拥有相同数量的初始化数据集?
keydata_without_reference = (1,5,"data",True)
mykey = MyVect.get_instance(*keydata_without_reference)
dict2[mykey] = "some other data"