2013-07-15 67 views
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 

例如,帶有屬性 '名稱' 類 '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] 

回答

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。 (你可能需要圓括號才能這樣做。)

+1

我會重命名'list'。它會影響內建的'list'函數。 – Blender

+0

好的。我從OP的代碼複製/粘貼,沒有注意到。現在修復。 – jpmc26

3

您可以使用attrgettermap

from operator import attrgetter 

map(attrgetter('foo'), iterable) 

attrgetter('foo')創建函數r會影響您稱之爲的任何參數的foo屬性。此外,它在C中實現,並且將比getattr()和列表理解更快。

如果你使用Python 3,map不會返回一個列表,所以你必須通過list()才能得到一個。