从python中的对象列表中提取属性列表

Posted

技术标签:

【中文标题】从python中的对象列表中提取属性列表【英文标题】:Extract list of attributes from list of objects in python 【发布时间】:2011-02-13 22:49:48 【问题描述】:

我在 python 中有一个 uniform 对象列表:

class myClass(object):
    def __init__(self, attr):
        self.attr = attr
        self.other = None

objs = [myClass (i) for i in range(10)]

现在我想提取一个具有该类的某些属性的列表(比如说 attr),以便将它传递给一些函数(例如用于绘制该数据)

pythonic 的做法是什么,

attr=[o.attr for o in objsm]

?

也许派生列表并为其添加一个方法,所以我可以使用一些类似的成语

objs.getattribute("attr")

?

【问题讨论】:

查看重复的***.com/q/677656/127465,尤其是。答案是 operator.attrgetter How to extract from a list of objects a list of specific attribute?的可能重复 【参考方案1】:

attrs = [o.attr for o in objs] 是制作您所描述的列表的正确代码。不要为此尝试将list 子类化。那个sn-p有什么你不喜欢的地方吗?

【讨论】:

只是它太冗长而且我会经常使用它,所以一个快捷方式会很方便。 numpy 的结构化数组 arr['colname'] 或 recarrays arr.colname,已经提供了类似的东西,但在这种情况下,我使用的是保存命名数据(和一些函数)的对象。 如果这是你的意图,getOattr= lambda l,a: [getattr(i,a) for i in l] 这样你就可以getOattr(l,'id')getOattr(l,'name') 。如果您需要更具体的然后getIds= lambda l,a: [i.id for i in l] 以便您可以getIds(l) 我想知道两个答案中的“更好”是什么。圆括号() 或方括号[]。 ...其余的代码是相等的。好吧,我知道这些是它在内部工作的不同方式。但是作为一个 Python 新手,我不知道有没有关系,我应该遵循哪种方式。 @Beauty 他们做的事情略有不同,这有时可能很重要,例如,如果您想迭代结果两次或反转结果。【参考方案2】:

你也可以写:

attr=(o.attr for o in objsm)

这样你就得到了一个节省内存的生成器。更多福利请查看Generator Expressions。

【讨论】:

会访问 O(n) 操作的特定输入结果吗?例如,访问 attr[100] 的 index = 100 会导致生成器运行 100 步吗?

以上是关于从python中的对象列表中提取属性列表的主要内容,如果未能解决你的问题,请参考以下文章

如何从 excel 列中提取数据到 Python 中的列表?

使用 Python 删除对象列表中的重复项

从python中的列表中提取数据

在python中,如何通过匹配原始列表中的字符串模式从字符串列表中提取子列表

从NLTK for Python中的同义词列表中提取单词

根据R中的元素名称从列表中提取对象