2011-05-11 3 views
1

nodelist 오브젝트에 반복적으로 node 오브젝트가 있습니다. 임의의 조건 (예 : node.x > 17)에 따라이 노드를 증가시켜야합니다. 여기에 내가 지금 뭘하는지입니다 : 람다 할당을 포함 할 수 없기 때문에for 루프 (파이썬)의 클리너 할당

for node in nodelist: 
    if node.x > 17: 
     node.x += 1 

내가 map(lambda node: node.x += 1, nodelist) 할 수 없습니다. nodelist 개체가 자식 노드 이상으로 구성되어 있기 때문에 nodelist = [node.x + 1 for node in nodelist if...]을 수행 할 수 없습니다.

더 짧고/깨끗하게 만들 수있는 방법이 있습니까?

+6

? 그것은 나에게 꽤 똑바로 보인다. –

+0

-1 : 어떻게 과제를 "더 깨끗하게"할 수 있습니까? 상태 변경은 절차 적 프로그래밍의 핵심입니다. 할당 문은 상태 변경을 가능한 한 명확하게 만듭니다. 할당 문과 같이 중요한 것은 거의 없습니다. 귀하의 모범은 중대하고 중대한 임무 지명을 어둡고 모호하게 만듭니다. –

답변

7

나는 이미 매우 짧고 깨끗하다고 ​​생각합니다. 파이썬은 강력한 도구를 제공하지만 때로는 단순한 것이 가장 좋습니다. 이것은 그 시대의 하나처럼 보입니다.

나는 또한 당신이 가지고있는 것이 동등한 하나의 라이너보다 더 읽기 쉽다고 생각한다.


좋아, 말했다, 당신이 할 수 있습니다 : 심지어 한 줄에 압축 할 수

for node in (n for n in nodelist if condition): 
    node.x += 1 

합니다. 그러나 나는 솔직히 당신이 지금 가지고있는 방식을 선호합니다.

+0

예, for 루프가 짧고 깨끗한 솔루션이라는 데 동의해야합니다. "가장 작은 코드"콘테스트 답을 목표로하지 않는 한, 코드가 좋습니다. 목록이나 그 중 일부를 작성한다면 목록 이해력이 의미가있을 수 있습니다. –

+0

나는이 접근 방식을 직접적으로 선호한다. – zeekay

+0

감사. 나는이 "pythonic"개념이 내 머리에 들었다고 가정하고, 이제는 모든 파이썬 코드에 대해 불안합니다.) – ash

3

당신은 실제로 람다에 할당 할 수 있습니다 : 그에서 떨어져

import operator 
map(lambda node: operator.iadd(node.x,1), nodelist) 

각각

[operator.iadd(node.x,1) for node in nodelist if ...] 

를, 코드는 정말 나쁘지 않다 - 그것입니다 매우 간결하고 같이 읽기 쉬운. 성능 :

+2

이것은 줄이 짧지 만 많은 사람들이 그것을 더 깨끗하게 찾을 수 있을지 의심 스럽습니다. – rmmh

+0

전적으로 당신에게 동의합니다 - 저는 그 가능성을 지적하고자합니다. –

+1

테스트 할 경우 실제로 작동하지 않습니다. 'class Node (object) : pass'를 시도한 다음'nodelist = [Node(), Node()]'그리고 나서'nodelist [0] .x = 19; nodelist [1].nodelist ('node [nodelist의 노드] 노드')는 원래'[19,10]'이고 코드를 적용한 후에 [operator.iadd (node.x, 1) nodelist에있는 노드는 node.x> 17]'20을 출력하지만 노드리스트는 여전히 변경되지 않은 상태로 되돌아 간다 - 여전히 [19,10]. 간단한 for 루프 솔루션을 고수하는 것이 가장 좋습니다. –

0

나는 당신이 파이썬 일 :

당신의 목표는 무엇입니까 무리 것을 투표? 나는 네가 어떤 것을 얻을지 의심한다.

가독성? 음, 세 줄의 경우, 기능적 붕괴가이 경우 도움이 될지 확실하지 않습니다. 분명히 그렇게 분명하지 않을 것입니다.

+1

나는 사지에 나가서 OP의 원래 코드가 파이썬임을 밝힐 것이다. – senderle

0

당신은 실제로 람다를 사용할 수 있습니다 : 지금 뭐가 잘못

map(lambda node: node.x>17 and node.x+1 or node.x, nodelist)