从对象数组中获取所有对象的特定属性的数组

时间:2019-09-06 06:39:16

标签: python arrays

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

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

attr = (o.attr for o in objarray)

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

在我的情况下,我正在分析“结构”对象的数组,这些对象具有诸如晶格常数,原子位置等属性。该对象具有获取距离,角度等的功能,当我们给出原子的索引时将返回相应的值。我想要的是获取一个值列表(可能是一个属性,如晶格常数或对象的函数输出,如两个原子之间的距离),每个值对应于数组中的每个结构。为每个所需值(如上所述)创建一个单独的列表的效率较低,因为可能需要制作许多这样的列表,并且所需的值可能会根据目的而有所不同。

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

objarray[a:b].attr

可轻松用于绘图和其他功能。但这是行不通的,并且会出现错误:

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

或者,有没有一种方法可以创建一个对象数组,以上述方式处理对象。

2 个答案:

答案 0 :(得分:0)

为此,我可能会使用getattr内置函数。

profile = Profile.objects.get(user=user)
username = form.cleaned_data.get('username')
company = form.cleaned_data.get('company')
jobTitle = form.cleaned_data.get('jobTitle')
phonenumber = form.cleaned_data.get('phonenumber')
profile.save()

要创建所需的numpy数组:

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

答案 1 :(得分:0)

此答案的灵感来自使用getattr内置函数的@energya的答案。由于该答案提供了获取特定对象属性列表的功能,而问题是要获取对象数组中所有对象的特定属性列表。

因此,使用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)