从Python对象列表中提取属性列表

118 投票
3 回答
139754 浏览
提问于 2025-04-15 22:10

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

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

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

现在我想提取这个类的某个属性(比如说叫attr)来传给某个函数(比如用来绘制这些数据)。

那么,使用Python的好方法来实现这个目标是什么呢:

attr = [o.attr for o in objs]

也许可以从列表派生一个新类,并给它添加一个方法,这样我就可以用类似objs.getattribute("attr")的方式来获取属性?

3 个回答

2

另一种方法是可以对objs列表使用getattr()函数。

# for a generator
from itertools import repeat
attrs = map(getattr, objs, repeat('attr'))
# or even without itertools
attrs = map(getattr, objs, ['attr']*len(objs))

# for a list
attrs = list(map(getattr, objs, repeat('attr')))

使用getattr的一个好处是,如果某个属性不存在,它可以返回一个默认值。例如,下面这一行如果attr在对象中没有定义,就会返回'NA'

attrs = [getattr(o, 'attr', 'NA') for o in objs]

如果需要获取多个属性,operator.attrgetter会很有用。

from operator import attrgetter
attrs = list(map(attrgetter('attr', 'other'), objs))

注意,itertoolsoperator都是标准库的一部分。

134

这段代码 attrs = [o.attr for o in objs] 是用来创建一个列表的,正好符合你描述的那种情况。别试着去继承 list 这个东西来实现这个功能。你对这段代码有什么不满意的地方吗?

114

你也可以这样写:

attr=(o.attr for o in objsm)

这样你就得到了一个节省内存的生成器。如果想了解更多好处,可以看看 生成器表达式

撰写回答