从Python对象列表中提取属性列表
我在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))
注意,itertools
和operator
都是标准库的一部分。
134
这段代码 attrs = [o.attr for o in objs]
是用来创建一个列表的,正好符合你描述的那种情况。别试着去继承 list
这个东西来实现这个功能。你对这段代码有什么不满意的地方吗?
114