Python 如何使类函数类似于嵌套字典? 我想做什么
我试图创建一个可以存储和操作多组数据的类 然而,我在尽可能简单直观地访问数据方面遇到了困难。该对象本质上只是一个嵌套字典,其布局类似于:Python 如何使类函数类似于嵌套字典? 我想做什么,python,Python,我试图创建一个可以存储和操作多组数据的类 然而,我在尽可能简单直观地访问数据方面遇到了困难。该对象本质上只是一个嵌套字典,其布局类似于: data={“File1\u Column1”:{“header”:[…], “数据”:[…]}, “File1_Column2:{'header':[…], “数据”:[…]},…} 我想发生什么 假设我有一个名为data的此类实例,我希望data['File1\u Column1']['header']和data['File1\u Column1']['
data={“File1\u Column1”:{“header”:[…],
“数据”:[…]},
“File1_Column2:{'header':[…],
“数据”:[…]},…}
我想发生什么
假设我有一个名为data
的此类实例,我希望data['File1\u Column1']['header']
和data['File1\u Column1']['data']
返回人们期望的结果,但我也希望data['File1\u Column1']
返回与data['File1\u Column1']['data']相同的结果。我想要这个,因为我可以预见自己99%的时间都在使用数据列表,这将使它更方便
通过简单地利用\uu getitem\uuuu
,前两种方法非常简单,但是,我真的很难让后一种方法发挥作用
我得到的最接近的结果显示在下面的简化代码中。我曾尝试以各种方式对数据类的\uuuu getitem\uuuu
方法实现if语句,检查下标类的\uu getitem\uuuu
方法是否被调用,但没有成功
我已经试过了
类数据:
定义初始化(自):
self._data={}
def附加(自身、标签、数据):
自身数据[标签]=数据
定义获取项目(自我,标签):
类下标:
定义初始化(自身,数据):
self.\u data=数据
定义获取项目(自我,标签):
返回自。\u数据[标签]
子数据=下标(自身数据[标签])
返回子数据
数据=数据()
示例={'header':['Trace','Unit'],'data':[1,2,3,4]}
data.append('Label',示例)
打印(数据[“标签])
打印(数据['Label']['data'])
打印(数据['Label']['header'])
结果
有什么方法可以做到这一点吗?可以使用repr方法来做到这一点
您可以向下标类添加repr方法
def __repr__(self):
return str(self._data['data'])
下面是repr方法的代码和添加的示例-
class Data:
def __init__(self):
self._data = {}
def append(self, label, data):
self._data[label] = data
def __getitem__(self, label):
class Subscript:
def __init__(self, data):
self._data = data
self.label = label
def __getitem__(self, label):
self.label = label
return self._data[label]
def __repr__(self):
return str(self._data['data'])
subdata = Subscript(self._data[label])
return subdata
data = Data()
example = {'header': ['Trace', 'Unit'], 'data': [1, 2, 3, 4]}
example2 = {'header': ['Trace2', 'Unit2'], 'data': [11, 22, 33, 42]}
data.append('Label', example)
data.append('Label2', example2)
print(data['Label'])
print(data['Label']['data'])
print(data['Label']['header'])
print(data['Label2'])
print(data['Label2']['data'])
print(data['Label2']['header'])
结果(你期望发生的事情)-
也许您只需对不同的项目使用两个DICT:
headers= { "File1_Column1": ...,
"File1_Column2": ...
},
data = {"File1_Column1": ...,
"File1_Column2": ...}
您想如何区分调用对象中的列(data['File1\u Column1']
)和调用列中的数据(data['File1\u Column1']
)?不要认为这是可能的。您希望数据['Label']
根据数据['Label']
后面的内容计算为下标或[1,2,3,4]
。因为python看不到未来,所以这是不可能的。我认为是这样的,但我希望有一些东西是我看不到的。谢谢这只会改变对象的外观,而不会改变它的实际情况。你把你的对象放在一个小列表中,但是试着像它看起来一样使用它,它会完全失败。
class Data:
def __init__(self):
self._data = {}
def append(self, label, data):
self._data[label] = data
def __getitem__(self, label):
class Subscript:
def __init__(self, data):
self._data = data
self.label = label
def __getitem__(self, label):
self.label = label
return self._data[label]
def __repr__(self):
return str(self._data['data'])
subdata = Subscript(self._data[label])
return subdata
data = Data()
example = {'header': ['Trace', 'Unit'], 'data': [1, 2, 3, 4]}
example2 = {'header': ['Trace2', 'Unit2'], 'data': [11, 22, 33, 42]}
data.append('Label', example)
data.append('Label2', example2)
print(data['Label'])
print(data['Label']['data'])
print(data['Label']['header'])
print(data['Label2'])
print(data['Label2']['data'])
print(data['Label2']['header'])
Shreyashs-MacBook-Pro:~ shreyash$ python test.py
[1, 2, 3, 4]
[1, 2, 3, 4]
['Trace', 'Unit']
[11, 22, 33, 42]
[11, 22, 33, 42]
['Trace2', 'Unit2']
headers= { "File1_Column1": ...,
"File1_Column2": ...
},
data = {"File1_Column1": ...,
"File1_Column2": ...}