2013-07-15 4 views
3

나는 인스턴스 목록을 가지고 있으며,이 목록에서 각 인스턴스의 특정 속성을 추출하여 새 목록을 만들어야합니다. 저는 파이썬에 다소 익숙합니다.이 문제를 해결할 수있는 유일한 방법은 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

대신 exec를 사용하는 getattr의 사용을 만들 수 있습니다

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()보다 빠르며 목록 이해가 가능합니다.

파이썬 3을 사용하는 경우 map은 목록을 반환하지 않으므로 list()을 통해 전달해야합니다.