我有一个实例列表,我需要从该列表中提取每个实例的某个属性,这将形成一个新列表。我对Python有些新手,我能解决这个问题的唯一方法是使用exec()函数,这显然使它成为一个可怕的解决方案。有人知道更好的方法吗?
我目前的职能是:
def attributelist(list, attribute):
"Inputs a list of instances and returns a list of a certain attribute of those instances"
output = []
for instance in list:
exec("output.append(instance." + attribute + ")")
return output
例如,使用属性“name”的类“my_class”:
instances = []
for i in range(10):
instances.append(my_class(i))
attributelist(instances, 'name')
Out: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
答案 0 :(得分:3)
您可以attrgetter
使用map
:
from operator import attrgetter
map(attrgetter('foo'), iterable)
attrgetter('foo')
创建一个函数,该函数返回您调用它的任何参数的foo
属性。另外,它在C中实现,并且比getattr()
和列表理解更快。
如果您使用的是Python 3,map
将不会返回列表,因此您必须通过list()
传递一个列表才能获得。
答案 1 :(得分:3)
您可以使用getattr
而不是exec
:
output.append(getattr(instance, attribute))
您还可以使用生成器简化您的功能:
def attributelist(list_, attribute):
"Inputs a list of instances and returns a list of a certain attribute of those instances"
return [getattr(i, attribute) for i in list_]
如果你不介意使用迭代器而不是list
,你可以不用方括号。 (您可能需要使用括号。)