共享某些元素的数组的数据结构 - Python

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而不是最好的方式.谢谢你的任何建议.

Aja*_*234 1

您可以创建一个包装类来处理相同值的所有元素的更新:

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)