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


78

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

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")


1
参见重复的stackoverflow.com/q/677656/127465,尤其是。与operator.attrgetter的答案
ThomasH 2010年

Answers:


77

您还可以编写:

attr=(o.attr for o in objsm)

这样,您将获得一个节省内存的生成器。有关更多好处,请参见Generator Expressions


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

83

attrs = [o.attr for o in objs]是制作类似您所描述的清单的正确代码。不要试图为此子类化list。您对那个片段有什么不满意的地方吗?


2
只是它太冗长,我将经常使用它,因此快捷方式很方便。numpy的结构化数组arr ['colname']或recarrays arr.colname已经提供了类似的功能,但是在这种情况下,我使用的是持有命名数据(和某些函数)的对象。
franjesus,2010年

如果这是您的意图,则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)
user2390183
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.