gpt4 book ai didi

python - 存储固定 key key :value datasets that are accessed by keys in python?的最佳方式

转载 作者:行者123 更新时间:2023-12-01 05:51:03 27 4
gpt4 key购买 nike

我想要的是能够处理具有一组固定键的数据集。所有键都是字符串。数据永远不会被编辑。我知道这可以用普通的字典来完成,如下所示:

data_a = {'key1': 'data1a', 'key2': 'data2a', 'key3': 'data3a'}
data_b = {'key1': 'data1b', 'key2': 'data2b', 'key3': 'data3b'}
data_c = {'key1': 'data1c', 'key2': 'data2c', 'key3': 'data3c'}

它们必须能够像这样被调用:

data_a['key1'] # Returns 'data1a'

但是,这看起来浪费内存(因为字典显然将自己保留 1/3 空或类似的东西,并且还多次存储 key )并且创建起来也很乏味,因为我需要不断输入在我的代码中一遍又一遍地使用相同的键。我还冒着意外更改数据集中某些内容的风险。

我当前的解决方案是首先将一组键存储在元组中,然后将数据也存储为元组。它看起来像这样:

keys = ('key1', 'key2', 'key3')
data_a = ('data1a', 'data2a', 'data3a')
data_b = ('data1b', 'data2b', 'data3b')
data_c = ('data1b', 'data2c', 'data3c')

要检索数据,我会这样做:

data_a[keys.index('key1')] # Returns 'data1a'

然后,我了解到了这个叫做namedtuples的东西,它似乎能够做我需要的事情:

import collections
Data = collections.namedtuple('Data', ('key1', 'key2', 'key3'))
data_a = Data('data1a', 'data2a', 'data3a')
data_b = Data('data1b', 'data2b', 'data3b')
data_c = Data('data1b', 'data2c', 'data3c')

但是,看来我不能简单地通过键调用该值。相反,要通过键检索数据,我必须使用 getattr,这看起来不太直观:

getattr(data_a,'key1') # Returns 'data1a'

我的标准首先是内存效率,然后是性能效率。在这 3 种方法中,哪一种是最好的做事方法?或者我是否遗漏了一些东西,并且有一个更Pythonic的习惯用法可以得到我想要的东西?

编辑:我现在最近还了解了 __slots__ 的存在,它显然对键:值对运行更有效,同时消耗了相同(?)的内存量。是否有类似于 this 的实现是命名元组的合适替代品吗?

最佳答案

是的,__slots__ 应该可以。

class Data:
__slots__ = ["key1", "key2"]

def __init__(self, k1, k2):
self.key1, self.key2 = k1, k2

def __getitem__(self, key):
if key not in self.__slots__:
raise KeyError("%r not found" % key)
return getattr(self, key)

让我们尝试一下:

>>> Data(1, 2)["key1"]
1

key not in self.__slots__ 的条件是健全性检查;如果 __init__ 不存在,getattr 会很乐意为我们获取它。

关于python - 存储固定 key key :value datasets that are accessed by keys in python?的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14301511/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com