将实例列表转换为实例属性列表

时间:2013-07-15 03:03:26

标签: python list instance

我有一个实例列表,我需要从该列表中提取每个实例的某个属性,这将形成一个新列表。我对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]

2 个答案:

答案 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,你可以不用方括号。 (您可能需要使用括号。)