2012-01-24 4 views
1

나는 종종 자신과 같은 비효율적 인 루프를하고있다 찾을입니다. 그건 그렇고, 이것은 덧셈 연산자가 비슷한 인덱스의 값을 (1, 2, 3) + (4, 5, 6, 7) == (5, 7, 9, 7)처럼 추가하는 터플의 하위 클래스입니다. 나는 filter()이 나를 도와 줄 것이라고 생각 하겠지만 어떻게 구현할 지 확신하지 못합니다.내가 지능형리스트로이 바꿀 수있는 방법이

편집 : 이것은 파이썬 3

+0

'dimensions.append (sum map (람다 x : (x는 없음)과 1 또는 2) - 1, (a, b)))')'당신이 생각하는 바가 무엇입니까? 이것은 dimension.append (a는 None + b가 None이 아닌)를 작성하는 다소 이상한 방법입니다. 이것은 이미 이상합니다. –

+0

빠른 확인, 조기 최적화 중입니까? 여러분과 다른 사람들이 이것을 위해 루프를 이해하는 것은 쉽습니다. 실제로 프로그램에서 큰 속도 저하를 일으키는 지, 그렇다면 상관합니까? 런타임이 50 나노 세컨드에서 150 나노 세컨드로 세 배가된다면주의를 기울이지도 않을 것입니다. –

+0

@SpencerRathbun :이 코드를 이해하는 것은 분명히 * 쉽지는 않습니다. 여러 가지 다양한 일을하는 답을 보여줍니다. –

답변

2

이 작업을 수행하는 가장 간결한 방법은

map(sum, itertools.izip_longest(self, other, fillvalue=0)) 

또는

itertools.starmap(operator.add, 
        itertools.izip_longest(self, other, fillvalue=0)) 

이 내가 원래 코드가 어떻게해야 추측 무엇을 수행한다. 파이썬 3을 사용한다면 결과를 터플이나리스트 또는 원하는 것으로 변환하십시오.

+0

한편, 짧고 간단한 진술을 사용하면 명확 해집니다! –

+0

저는 파이썬 3 인터프리터를 가지고 있지 않습니다. 파이썬 3에 있나요? 문서에서 빨리 검색 한 후에 찾을 수 없습니다. –

+0

@TylerCrompton : ['izip_longest'] (http://docs.python.org/library/itertools.html#itertools.izip_longest)는 Python 2.6에서 소개되었습니다. 어떤 버전을 사용하고 있습니까? –

1

위한 방법에 대한이 검증되지 않은 비록 :

dimensions = [sum(map(lambda x: ((x is None) and 1 or 2) - 1, (self[i] if i < self.numberOfDimensions else None, other[i] if i < other.numberOfDimensions else None))) for i in range(max(self.numberOfDimensions, other.numberOfDimensions))] 
2

꽤 추한 이럴 비록 여기에 지능형리스트를 사용하는 사소한 방법이 있습니다.

dimensions = [ 
    sum(map(lambda x: ((x is None) and 1 or 2) - 1, (
    self[i] if i<self.numberOfDimensions else None, 
    other[i] if i<other.numberOfDimensions else None 
))) 

    for i in range(max(self.numberOfDimensions, other.numberOfDimensions)) 
] 
+0

실제로 "해독 가능성이 계산됩니다." 나는 그것이 추악한 데 동의한다. –

+0

Python 3 사용. –

+0

@TylerCrompton이 2.6 이상에서 작동해야합니까? –

6

나는 완전히 그것을 얻고 있는지 확실하지 않습니다,하지만 난 다음 stdlib가 당신의 친구입니다 생각 :

from itertools import izip_longest 
dimensions = [] 
for a, b in izip_longest(self, other, fillvalue=0): 
    dimensions.append(a + b) 

내가 지능형리스트는 매우 깨끗하다고 ​​생각하지 않습니다.

+1

나는 그것이 원래 코드가하는 것은 아니지만 이것은 OP가 원하는 것이라고 생각합니다. –

+0

저는 파이썬 3 인터프리터를 가지고 있지 않습니다. 파이썬 3에 있나요? 문서에서 빨리 검색 한 후에 찾을 수 없습니다. –

+1

제 대답은 2.7이었습니다. python3에서도 ['itertools.zip_longest()'] (http://docs.python.org/py3k/library/itertools.html#itertools.zip_longest)입니다. 호기심에 대한 [2.7 용 문서] (http://docs.python.org/library/itertools.html#itertools.izip_longest)는 다음과 같습니다. – AdamKG

0

나는 당신이 필요로하는 누락 된 부분이 생각 : 물론

(a,b) = (self[i] if i < self.numberOfDimensions else None, other[i] if i < other.numberOfDimensions else None) 

, 나는 하나의 표현이 더 읽기 될 것이라고 확신 아니에요. 어떤 종류의지도를 사용하여 (a,b)을 먼저 생성하는 것이 더 나을 것입니다.

관련 문제