我正在尝试创建一个可以存储和处理多组数据的类。
但是,我在使访问数据尽可能简单直观方面遇到麻烦。该对象实际上实质上是一个嵌套的字典,布局看起来像这样:
data = { "File1_Column1": {'header': [...],
'data': [...]},
"File1_Column2": {'header': [...],
'data': [...]}, ...}
假设我有一个名为data
的此类的实例,我希望data['File1_Column1']['header']
和data['File1_Column1']['data']
返回所期望的内容,但我也希望data['File1_Column1']
可以返回与data['File1_Column1']['data']
相同的内容。我之所以这样,是因为我可以预见自己有99%的时间会使用数据列表,这将使它更加方便。
前两个很简单,只需使用__getitem__
, 即可完成,我真的很想让后者工作。
我得到的最接近的代码显示在下面的简化代码中。我尝试以各种方式对Data
类的__getitem__
方法实施if语句,检查是否调用了Subscript
类的__getitem__
方法,但是已经没有运气。
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
def __getitem__(self, label):
return self._data[label]
subdata = Subscript(self._data[label])
return subdata
data = Data()
example = {'header': ['Trace', 'Unit'], 'data': [1, 2, 3, 4]}
data.append('Label', example)
print(data['Label'])
print(data['Label']['data'])
print(data['Label']['header'])
<__main__.Data.__getitem__.<locals>.Subscript object at 0x007B4B10>
[1, 2, 3, 4]
['Trace', 'Unit']
[1, 2, 3, 4]
[1, 2, 3, 4]
['Trace', 'Unit']
有没有办法做到这一点?
答案 0 :(得分:0)
也许您只对不同的项目使用2个字典:
headers= { "File1_Column1": ...,
"File1_Column2": ...
},
data = {"File1_Column1": ...,
"File1_Column2": ...}
答案 1 :(得分:-1)
可以使用 repr 方法执行此操作。
您可以向Subscript类添加 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'])
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']