给定一个表示2D列表的自定义dataclass,有没有一种Pythonic式的或者特别优雅的方式来通过特殊的类方法,即__setitem__和__getitem__来提供不同的修改方法。
例如,第一个维度是街道,第二个维度是房屋。您希望能够抓取整条街道,以及单个房屋。类似地,您希望创建整个街道,以及现有街道上的单个房屋。
我知道你可以混合使用默认参数,或者带有类型/长度检查的元组。或者,您也可以安全地使用它,并具有独立的访问功能。
然而,这似乎也是一个具有经典解决方案的问题。谢谢!
使用类型检查的示例:
class multiDimList(object):
def __init__(self):
self._data = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
def __getitem__(self, index):
if isinstance(index, tuple):
x, y = index
return self._data[x][y]
else:
return self._data[index]
def __setitem__(self, index, value):
if isinstance(index, tuple):
x, y = index
self._data[x][y] = value
else:
self._data[index] = value
myMDL = multiDimList()
print(myMDL[0])
print(myMDL[0, 0])
myMDL[0] = [9, 10, 11]
print(myMDL[0])
myMDL[0, 0] = 12
print(myMDL[0])输出:
[0, 1, 2]
0
[9, 10, 11]
[12, 10, 11]发布于 2020-05-19 02:37:46
可以,使用NumPy。如果您将myMDL创建为一个NumPy array,它将完全按照您的要求工作。
import numpy as np
myMDL = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
print(myMDL[0])
print(myMDL[0, 0])
myMDL[0] = [9, 10, 11]
print(myMDL[0])
myMDL[0, 0] = 12
print(myMDL[0])输出:
[0 1 2]
0
[ 9 10 11]
[12 10 11]请注意,它显示为一个数组-没有逗号,在9之前有前导空格。
NumPy还支持许多其他功能,比如访问其他维度。例如,要访问第二列:
>>> print(myMDL[:,1])
[10 4 7]https://stackoverflow.com/questions/61875667
复制相似问题