【问题标题】:2D Dict with fast Column and Row deletion?具有快速列和行删除的 2D 字典?
【发布时间】:2020-07-13 16:13:14
【问题描述】:

我需要一个类似于 2D dict 的结构,它允许快速删除操作。 F.e.

    x['a']['b'] = 1
    x['a']['c'] = 1
    x['a']['d'] = 1
    x['b']['a'] = 1
    x['b']['f'] = 1
    x['e']['b'] = 1
    x['f']['c'] = 1
    ...

即键 a,b,c,e,f,c,... 可以在两个维度中使用

第一维删除速度很快,即

   del x[a]

但如果要按第二维删除,则必须先枚举元素,这很慢。

您也可以将此结构想象为 2D 表,其中列和行都有名称,并且您可以快速删除整行或整列。同时,每次添加一个单元格。

你的解决方案是什么?

PS> 一种可能性是保留 2 到 1 维的键列表,但这会占用太多内存,并且会保留不会被删除的行/列的数据!


使用 Pandas 数据框会更快吗?

  key1, key2, data

【问题讨论】:

    标签: python dictionary 2d del two-way


    【解决方案1】:

    我认为如果没有额外的内存,这将是不可能的。至于第二个问题,您实际上可以存储两个维度的键并在需要时删除。使用两个字典的简单解决方案:

    from collections import defaultdict
    
    class Table2D:
    
        def __init__(self, *args, **kwargs):
            self._row_to_cols = defaultdict(dict)
            self._col_to_rows = defaultdict(dict)
    
        def add(self, c, r):
            self._col_to_rows[c][r] = 1
            self._row_to_cols[r][c] = 1
    
        def get_row(self, r):
            return self._row_to_cols[r]
    
        def get_col(self, c):
            return self._col_to_rows[c]
    
        def rem_row(self, r):
            for c in self._row_to_cols[r]:
                del self._col_to_rows[c][r]
            del self._row_to_cols[r]
    
        def rem_col(self, c):
            for r in self._col_to_rows[c]:
                del self._row_to_cols[r][c]
            del self._col_to_rows[c]
    
    t2d = Table2D()
    t2d.add('a', 'c')
    t2d.rem_col('a')
    print(t2d.get_col('a')
    

    【讨论】:

      猜你喜欢
      • 2019-06-27
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 2020-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多