关于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的人应该能够理解。我认为。谢谢你的帮助!