【发布时间】:2022-01-15 10:17:30
【问题描述】:
我有一个对象列表。这些对象有嵌套的属性,这些属性是按照hpaulj在这篇帖子中回复的一种方法生成的:Object-like attribute access for nested dictionary。
我希望能够在这些对象中找到属性和属性值,并操作它们所持有的数据。然而,在实际场景中,可能有超过一百万个对象,并且属性可能嵌套很深,这使得在需要进行大量操作时通过平面列表进行搜索是一项代价高昂的工作。
例如,假设对象列表如下:
list_of_objects = [object1, object2, object3, object4]
- object1 具有以下属性:
self.country = "Kenya", self.disease = "breast cancer" - object2 具有以下属性:
self.country = "Kenya", self.disease = "diabetes" - object3 具有以下属性:
self.country = 'Ireland', self.risk_factor.smoking = "Current" - object4 具有以下属性:
self.country = 'Kenya', self.risk_factor.smoking = "Previous"
这些对象是从以下State 类创建的:
class State:
def __init__(self, state_dictionary):
self._state_dictionary = state_dictionary
for key, value in self._state_dictionary.items():
if isinstance(value, dict):
value = State(value)
setattr(self, key, value)
在 object3 的情况下,state_dictionary 的示例如下:
state_dictionary = {
"country":"Ireland",
"risk_factor":{
"smoking":"Current"
}
}
重要的是,嵌套属性也是 State 对象。
我想影响所有拥有一个属性、一组嵌套属性或拥有一个具有指定值的属性的对象。
我的想法是创建一个“控制器”,它将原始列表作为单独的列表存储在控制器类的对象实例中。每个原始属性和值都会指向包含这些属性或值的对象列表,基本设计如下:
class Controller:
def __init__(self, list_of_objects):
self.list_of_objects = list_of_objects # Our list of objects from above
self.create_hierarchy_of_objects()
def create_hierarchy_of_objects(self):
for o in self.list_of_objects:
# Does something here
create_hierarchy_of_objects 方法运行后,我可以进行以下操作:
-
Controller.country.Kenya将包含 self.country 为“肯尼亚”的所有对象的列表,即 object1、object2、object4 -
Controller.disease将包含具有 self.disease 属性的所有对象的列表,即 object1 和 object2 -
Controller.risk_factor.smoking.Current将包含具有该组属性的对象列表,即 object3
问题是 create_hierarchy_of_objects 将如何工作?
我几点澄清
- 嵌套任意长,并且值可能相同,例如
self.risk_factor.attribute1.attribute2 = "foo"-
self.risk_factor.attribtue3.attribute4 = "foo"也一样。
- 可能有更简单的方法可以做到这一点,我欢迎任何建议。
【问题讨论】:
标签: python object filter hierarchical