使用默认dict创建树数据类型:检测某些条目并对其进行操作

时间:2018-03-01 20:12:24

标签: python class data-structures decorator defaultdict

关于SO的第一个问题!请耐心等待,需要一些背景知识。

我开始使用类来创建类似于matlab中的struct的数据存储容器。当使用Python开源时,我还没有完全取代它,它在组合不仅仅是数字数组数据时非常有用,或者只是更有意义地引用带有名称而不是标记的东西。

我意识到使用类不是最好的几层深层次的事情(对吧?大多只是混乱而且可能很慢),我需要一个通用的树数据类型。我正在开发一个自动化Excel的项目,数据必须根据单元格中的内容进行存储,以后进行操作,并可能重写回电子表格的某些区域。当我们可以使用xlwings和openpyxl来利用我们用适应性的OS可移植语言(如Python)编写的其他东西时,谁想要用VBA编写?

在此帖子的基础上: Looking for a good Python Tree data structure

我喜欢这个的可扩展性:

import collections
def Tree():
     return collections.defaultdict(Tree)

我可以制作任何类型的任意图层。我还希望包含一些函数来管理它,就像我在我的类存储容器中一样,如本文底部的UserData类所示。有一个例子,它在该页面上的一个类中使用:

class Tree(defaultdict):
    def __call__(self):
        return Tree(self)

    def __init__(self, parent):
        self.parent = parent
        self.default_factory = self

所以我进行了实验,找出了扭结,并创造了这个课程:

import collections
class TreeClass(collections.defaultdict):

    def __call__(self):
        return TreeClass(self)

    def Tree(self):
        return collections.defaultdict(self.Tree)

    def __init__(self, parent):
        self.parent = parent
        self.default_factory = self
        #self.x = 'xvar'
        #self._locations_idx=[]
        self['someInitKey'] = 'value'

我希望类和数据结构的功能本身运行的原因是做这样的事情:

import openpyxl.utils as opx

class UserData():
    '''For more info on decorators:
        https://stackoverflow.com/questions/27571546/dynamically-update-attributes-of-an-object-that-depend-on-the-state-of-other-att
        https://stackoverflow.com/questions/17330160/how-does-the-property-decorator-work
        '''

    def __init__(self):
        self.locations=[]
        self._locations_idx=[]

    @property # Auto update locations_idx when locations changes
    def locations_idx(self):#, locations=self.locations):
        self._locations_idx = self.locations # set list to same len
        for i in range(len(self.locations)):
            current_loc = self.locations[i]
            # write indexed location over copy of list of same len
            # TODO check make sure this is zero indexed
            self._locations_idx[i] = (opx.column_index_from_string(current_loc[0]), int(current_loc[1]))
        return self._locations_idx

其中opx.column_index_from_string是来自openpyxl的函数,用于从字母返回相应的0索引索引,并将其合并为一个元组,将'A1','B2'列表转换为(0, 0),(1,1)等

这样,虽然使用空位置列表初始化类,但当列表填充'C4','B22'等时,myUserData.locations_idx包含这些索引的更新列表,这些列表对其余的非常有用当您不想通过'excel location'引用内容时,该程序。

现在我的实际问题是:

假设我使用它来制作模式defaultdict[carMake][carModel][carColor][locationInSpreadsheet]的默认dict,如下所示:

myUserData['toyota']['corolla']['grey']['location']='B2'

myUserData['chevy']['Volt']['blue']['location']='B6'

并且在添加'location'键/值后,我想动态创建相应的:

myUserData['chevy']['Volt']['blue']['location_idx']

返回(1,5)。

唯一的问题是我是default_dict的新手,很少需要OOP Python,不知道甚至google什么(将许多层引用到由默认dict python制作的树数据结构中?)。有人可以帮忙或给我一些指示吗?我讨厌拖延其他人,并且在Python上做了很长的路,而不需要在这里问一个问题,但是当我甚至不知道该找什么时,我已经达到了极限。我希望你能从这些例子中说出我想要做的事情,我想我正在以正确的方式解决这个问题。任何帖子格式/礼仪,标签建议,也欢迎。如果有什么不清楚的地方,请告诉我,但我已经尝试使这些示例足够通用并且易于理解,使用Python类和默认dicts的人应该能够理解。我认为。谢谢你的帮助!

0 个答案:

没有答案