3

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

2 回答 2

3

您可以attrgetter使用map

from operator import attrgetter

map(attrgetter('foo'), iterable)

attrgetter('foo')创建一个函数,该函数返回foo您调用它的任何参数的属性。另外,它是用 C 语言实现的,并且会比getattr()列表理解更快。

如果您使用的是 Python 3,map则不会返回列表,因此您必须通过它list()才能获得一个。

于 2013-07-15T03:06:22.847 回答
3

您可以使用 ofgetattr而不是 using 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. (您可能需要括号才能这样做。)

于 2013-07-15T03:07:43.777 回答