从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 中的列表?