2011-10-01 6 views
7

나는 목록을 가지고 있으며, 특정 조건을 충족하는 항목에 대해서만 특정 기능을 사용하고자한다. 다른 항목은 수정하지 않고 그대로 둔다.파이썬 목록 이해 - 간단

예 : 짝수 인 요소 만 2로 곱하고 싶다고 말합니다.

a_list = [1, 2, 3, 4, 5] 

구인 결과 :

a_list => [1, 4, 3, 8, 5] 

그러나 [elem * 2 for elem in a_list if elem %2 == 0] 수확량 [4, 8] (이것은 또한 필터로서 작용).

올바른 방법은 무엇입니까?

답변

18

사용하십시오 conditional expression :

[x * 2 if x % 2 == 0 else x 
for x in a_list] 

(수학 괴짜 주 : 당신은 또한

[x * (2 - x % 2) for x in a_list] 

와 함께이 특별한 경우를 해결할 수 있지만, 어쨌든 첫 번째 옵션을 선호하는 것)

+0

감사합니다. 또한 편집 해 주셔서 감사 드리며 다음 번에 같은 형식을 사용하겠습니다. –

2
a_list = [1, 2, 3, 4, 5] 

print [elem*2 if elem%2==0 else elem for elem in a_list ] 

또는 수정하려는 목록이 매우 긴 경우

a_list = [1, 2, 3, 4, 5] 

for i,elem in enumerate(a_list): 
    if elem%2==0: 
     a_list[i] = elem*2 

는 그렇게 만도 요소

을 수정
+0

'a_list [:] = list_comprehension'도 현재 위치에서 대체해야하지 않습니까? 그리고 파이썬으로 반복 할 필요없이? – Voo

+0

@agf 그러면 새 목록이 어딘가에 생성되고 이후에 요소가 업데이트됩니까? 너무 나쁜 점은 목록의 제한으로 인해 요소를 겹쳐 쓰기 전에 참조 할 수 있다고 보장 할 수 있으므로 최적화 할 수 있다고 생각했습니다. – Voo

+0

@Voo In-place 할당은 모든 반복 가능 함수에서 작동하므로 대신 생성자 표현식에서 수행 할 수 있습니다. 방금 시도했는데 목록의 길이보다 적은 항목을 생성하는 'reversed (a_list)'또는 생성기를 사용하더라도 실제로 작동하는 것 같습니다. 내가 전에 생각한 것이 아닙니다. 아이디어를 가져와 주셔서 감사합니다 :). – agf

0

당신은 사용할 수 있습니다 람다 :

>>> a_list = [1, 2, 3, 4, 5] 
>>> f = lambda x: x%2 and x or x*2 
>>> a_list = [f(i) for i in a_list] 
>>> a_list 
[1, 4, 3, 8, 5] 

편집-agf의 말에 대해 생각 나는 내 코드의 두번째 버전을했다 :

>>> a_list = [1, 2, 3, 4, 5] 
>>> f = lambda x: x if x%2 else x*2 
>>> a_list = [f(i) for i in a_list] 
>>> a_list 
[1, 4, 3, 8, 5] 
+0

삼항 연산을 에뮬레이션하기 위해'condition and true_value or false_value'를 사용하지 마십시오. 파이썬에는 실제 버전이 있습니다. 또한, 람다 형식으로 랩핑 할 필요가 없습니다. 목록 이해에서 올바르게 작동하는 명령문이 아닌 표현식이기 때문에 어느 방식 으로든 래핑 할 필요가 없습니다. 'lambda'는 같은 제한이 있기 때문에리스트 이해력이나 생성자 표현에서 하나는 필요 없습니다. – agf

+0

@agf - 나는 람다에 대한 당신의 의견을 이해하지만 (이 점에 동의 함),이 경우 나에게 목록 이해에서 항목을 선택하는 논리를 다른 수준으로 설정하는 대안적인 방법 (멀리는 절대적으로 완벽하지는 않지만)으로 보인다. . 파이썬 삼항 연산자에 대해 나머지는 잘 주셔서 감사합니다. 이것을 반영하기 위해 제 2 판을 만들었습니다. –

+0

'lambda x :'와'f()'는 12 글자이고, [for i in a_list]는 18입니다. 그래서'lambda' 대신에 인라인을 사용하면 더 명확하고 빠르게 만듭니다. 단지 새로운 기능 대신에 전체적으로 분리 된 목록 이해력을 가지고 있다면 여섯 명만 추가 할 수 있습니다. – agf