2012-07-11 5 views
11

오늘 아침에 스크립트를 작성할 때 기대하지 않은 것을 발견했습니다. 나는 목록 이해력을 사용하여 하나의 성명서에서 모두 그것을 정렬하려고 시도하고 놀라운 결과를 얻었다. 다음 코드는 내 일반적인 사용 사례를 요약하지만,이 질문에 대한 단순화 :한 문장으로 목록 이해하기

Transaction = namedtuple('Transaction', ['code', 'type']) 

my_list = [Transaction('code1', 'AAAAA'), Transaction('code2', 'BBBBB'), Transaction('code3', 'AAAAA')] 

types = ['AAAAA', 'CCCCC'] 

result = [trans for trans in my_list if trans.type in types].sort(key = lambda x: x.code) 

print result 

출력 : 내가 이해를 사용하여 목록을 작성하는 경우

None 

는 다음 사후을 정렬 모든입니다 벌금. 왜 이런 일이 일어 났는지 궁금합니다.

+2

'sort' 메소드는리스트를 in * place *로 정렬 한 다음'None'을 반환합니다. – sloth

답변

21

에있어서, 모든 돌연변이 방법으로는 None를 반환합니다. 내장 된 함수 sorted()을 사용하여 새 정렬 된 목록을 반환하십시오.

result = sorted((trans for trans in my_list if trans.type in types), 
       key=lambda x: x.code) 

대신 lambda x: x.code

은 또한 operator.attrgetter("code") 약간 빠르게 사용할 수 있습니다.

0

sorted 내장 기능이 필요합니다. sort 메서드는 목록을 정렬하고 None을 반환합니다.

result = sorted([trans for trans in my_list if trans.type in types],key = lambda x: x.code) 

에 의해 약간 더 할 수있다 : list.sort() 장소의 목록을 정렬됩니다

import operator 
result = sorted((trans for trans in my_list if trans.type in types), key=operator.attrgetter("code")) 
+0

리스트 이해력을'sorted()'에 건네 주면리스트의 복사본이 생성된다는 것에주의하십시오. 이것은 반드시 느려질 필요는 없지만 더 높은 메모리 소비를 초래할 수 있습니다. –

+0

괄호 안에 생성자 표현식을 묶어야합니다. –

+0

@SvenMarnach - 괄호는 필요하지 않습니까? '정렬 된 x (x는 xrange (10)에 x)'은 나를 위해 잘 작동합니다. – mgilson

2

목록에있는 .sort을 호출하면 None가 반환됩니다. 이 결과가 result으로 지정된다는 것은 완벽한 의미입니다. 즉

, 당신은 다음, 지능형리스트와 익명으로 목록을 만들 .sort를 호출하고 .sort 호출의 결과가 result 변수에 저장되는 동안 목록이 손실됩니다.

다른 사람들이 말했듯이 sorted() 내장 함수를 사용하여 목록을 반환해야합니다. (sorted()은리스트의 정렬 된 복사본을 반환합니다.)