首页 > 解决方案 > 从对象数组中获取所有对象的特定属性的数组

问题描述

我有一个数组,其中包含一组具有许多属性的对象。我想以简单的方式将特定属性的值作为列表获取。

我确实知道我可以列出每个属性并将它们保存到单独的列表中,如下所示。

attr = (o.attr for o in objarray)

但是由于有很多属性,并且这些属性需要使用图、分布等进行分析。这不是一种有效的方法。

就我而言,我正在分析一个“结构”对象数组,这些对象具有晶格常数、原子位置等属性。该对象具有获取距离、角度等的功能,当我们给出原子索引时,它们将返回对应的值。我想要的是获得一个值列表(可能是像晶格常数这样的属性或像两个原子之间的距离这样的对象函数的输出),每个值对应于数组中的每个结构。为所需的每个值(如上所述)制作单独的列表效率较低,因为可能需要制作大量此类列表,并且所需的值可能因目的而异。

我需要的是通过以下方式获取值列表:

objarray[a:b].attr

它可以很容易地用于绘图和其他功能。但这不起作用并给出错误:

[ERROR] 'list' object has no attribute 'attr'

或者,有没有办法制作一个对象数组,以上述方式处理对象。

标签: pythonarrays

解决方案


这个答案的灵感来自@energya 使用getattr内置函数的答案。由于该答案使函数获取特定对象的属性列表,而问题是获取对象数组中所有对象的一个​​特定属性的列表。

所以使用 getattr 函数,

>>> my_object.my_attribute = 5
>>> getattr(my_object, 'my_attribute')
5

要获取所有对象的特定属性的 numpy 数组:

def get_attrs(all_objects, attribute, args=None): 
    """Returns the requested attribute of all the objects as a list"""
    if(args==None):
        # If the requested attribute is a variable
        return np.array([getattr(obj, attribute) for obj in all_objects])
    else:
        # If the requested attribute is a method
        return np.array([getattr(obj, attribute)(*args) for obj in all_objects])

# For getting a variable 'my_object.a' of all objects
attribute_list = get_attrs(all_objects, attribute)

# For getting a method 'my_object.func(*args)' of all objects
attribute_list = get_attrs(all_objects, attribute, args)

推荐阅读