2009-08-31 4 views
2

배경알고리즘은 재무 분석을 조작 한 번

두 개의 목록을 생성합니다. 같은 크기의 여러 목록이 있으며 분석을 위해 다른 목록으로 필터링됩니다. 병렬 목록별로 다른 필터링을하고 있습니다. 나는 a1, b1, c2가리스트의 튜플 (tuple)로 발생하도록 분석 할 수 있지만, 분석은 튜플을 다른 방법으로 스트라이핑하여 분석 (다른리스트, 베타 등)을 분석해야한다. 나는 세 번째 목록을 기반으로 서로 다른 두 가지 목록을 생성 할

를 수행 할 작업을

는 :

>>> a = list(range(10)) 
>>> b = list(range(10,20)) 
>>> c = list(i & 1 for i in range(10)) 
>>> 
>>> aprime = [a1 for a1, c1 in zip(a,c) if c1 == 0] 
>>> bprime = [b1 for b1, c1 in zip(b,c) if c1 == 0] 
>>> aprime 
[0, 2, 4, 6, 8] 
>>> bprime 
[10, 12, 14, 16, 18] 

이 제작하는 파이썬/함수형 프로그래밍/itertools 방법이 있어야한다 보인다 두 목록은 한 번만 세 목록을 반복합니다. 예 :

aprime, bprime = [a1, b1 for a1, b1, c1 in zip(a,b,c) if c1 == 0] 

물론 이것은 구문 오류를 생성합니다.

질문

는 파이썬 방법이 있나요?

마이크로 최적화 차기

못생긴하지만 파이썬 - 투 - 최대 한 줄이 끊임없이 인기 timeit의 솔루션과 내 원래의 코드 "단지에 대한 루프를 사용하여"밖으로 가장자리 케이지 경기 :

>>> import timeit 
>>> timeit.timeit("z2(a,b,c)", "n=100;a = list(range(n)); b = list(range(10,10+n)); c = list(i & 1 for i in range(n));\ndef z2(a,b,c):\n\treturn zip(*[(a1,b1) for a1,b1,c1 in zip(a,b,c) if c1==0])\n") 
26.977873025761482 
>>> timeit.timeit("z2(a,b,c)", "n=100;a = list(range(n)); b = list(range(10,10+n)); c = list(i & 1 for i in range(n));\ndef z2(a,b,c):\n\taprime, bprime = [], [];\n\tfor a1, b1, c1 in zip(a, b, c):\n\t\tif c1 == 0:\n\t\t\taprime.append(a1); bprime.append(b1);\n\treturn aprime, bprime\n") 
32.232914169258947 
>>> timeit.timeit("z2(a,b,c)", "n=100;a = list(range(n)); b = list(range(10,10+n)); c = list(i & 1 for i in range(n));\ndef z2(a,b,c):\n\treturn [a1 for a1, c1 in zip(a,c) if c1 == 0], [b1 for b1, c1 in zip(b,c) if c1 == 0]\n") 
32.37302275847901 
+2

왜 병렬 목록을 반복하려고? 당신이 해결하고자하는 전반적인 문제는 무엇입니까? 아마 여러 개의 병렬리스트를 반복하는 것보다 간단 할 것입니다. –

+0

알고리즘은 재무 분석을 조작합니다. 같은 크기의 여러 목록이 있으며 분석을 위해 다른 목록으로 필터링됩니다. 실제로 필자는 병렬 목록별로 다른 필터링을 수행하고 있습니다. 나는 a1, b1, c2가리스트의 튜플 (tuple)로 발생하도록 분석 할 수 있지만, 분석은 튜플을 다른 방법으로 스트라이핑하여 분석 (다른리스트, 베타 등)을 분석해야한다. – hughdbrown

+0

aprime 및 bprime을 작성하는 데 문제가있는 것은 아닙니다. 어떤면에서 부정확하거나 부적절한가? –

답변

3

이이 못난 코드 상을 이길 수 있습니다,하지만 그것은 하나 개의 라인에서 작동 :

aprime, bprime = zip(*[(a1,b1) for a1,b1,c1 in zip(a,b,c) if c1==0]) 
+0

@ kaizer.se :이 설명은 무엇을 의미합니까? – hughdbrown

+0

별표를 사용하는 경우 zip을 사용하여 압축을 풀 수 있습니까? zip (* zip (a, b)) == a, b – ACoolie

+0

zip - 압축을 풀면 파이썬 관용구처럼 느껴지지만 결국은 거의 사용되지 않는다고 생각합니다. for 루프가 더 명확합니다. 그건 그렇고리스트 생성기 대신 생성기 표현식을 사용할 수있다. (나는 여기서 그다지 중요하지 않다.) 목록이 매우 길면 itertools.izip이있다. – u0b34a0f6ae

0

목록 함축 한 번에 여러 개의 목록을 만들 수있는 방법은 없습니다 - 당신은 단지 당신이 그것을 다른 방법으로 할 필요 해요 번 반복 할 경우 - 가능한 루프와 함께 .

은 목록 이해를 사용하여 첫 번째 요소가 하나의 목록에 속하며 두 번째 요소가 다른 목록에 속하는 튜플 목록을 만듭니다. 하지만 별도의 목록으로 사용하려는 경우 별도의 작업으로 분할해야합니다.

4

은 그냥 for 루프 사용

aprime = [] 
bprime = [] 
for a1, b1, c1 in zip(a, b, c): 
    if c1 == 0: 
     aprime.append(a1) 
     bprime.append(b1)