Den*_*loe 14 python data-structures
我有一组在某些元素上"重叠"的数组.这是一个涉及3个字符数组的示例图片:
array0?
'A' ?array2
array1?'B' 'D' 'E'
'C' 'F'
Run Code Online (Sandbox Code Playgroud)
重要的是对数组的更改应该尊重这种结构.因此,例如,如果我将array0中的'B'更改为'X',则array1中的'B'也应更改为'X'.
我的问题是在Python中实现这个的好方法是什么?
到目前为止,我想到了两件事:
一,我可以制作一个定制的类,其实例包含一个完全不同的列表,以及它所具有的任何重叠的信息,并适当地实现更新方法,以便对重叠的其他列表重复列表的任何更改.这似乎有点过分,并涉及重复数据.
二,我可以通过使用像这样的单例列表来做到这一点:
data = [['A'], ['B'], ['C'], ['D'], ['E'], ['F']]
array0 = [data[0], data[1], data[2]]
array1 = [data[1], data[3], data[4]]
array2 = [data[4], data[5]]
for array in array0, array1, array2:
print(array)
>>> [['A'], ['B'], ['C']]
>>> [['B'], ['D'], ['E']]
>>> [['E'], ['F']]
array0[1][0] = 'X'
for array in array0, array1, array2:
print(array)
>>> [['A'], ['X'], ['C']]
>>> [['X'], ['D'], ['E']]
>>> [['E'], ['F']]
Run Code Online (Sandbox Code Playgroud)
但我觉得这可能是hacky而不是最好的方式.谢谢你的任何建议.
您可以创建一个包装类来处理相同值的所有元素的更新:
arr = [[['A'], ['B'], ['C']], [['B'], ['D'], ['E']], [['E'], ['F']]]
class WrapArray:
def __init__(self, _data):
self.d = _data
def __getitem__(self, _x):
self.x = _x
class _wrapper:
def __init__(self, _inst):
self.ref = _inst
def __setitem__(self, _y, _val):
_place = self.ref.d[self.ref.x][_y][0]
self.ref.d[self.ref.x][_y][0] = _val
for i in range(len(self.ref.d)):
for b in range(len(self.ref.d[i])):
if self.ref.d[i][b][0] == _place:
self.ref.d[i][b] = [_val]
return _wrapper(self)
def __repr__(self):
return str(self.d)
array = WrapArray(arr)
array[1][0] = 'X'
Run Code Online (Sandbox Code Playgroud)
输出:
[[['A'], ['X'], ['C']], [['X'], ['D'], ['E']], [['E'], ['F']]]
Run Code Online (Sandbox Code Playgroud)