2012-11-12 5 views
1

[1, 2, 3, 4, 5, 6]과 같은 일반적인 숫자 목록을 보면이 목록을 [ 1 + 2j), (3 + 4j), (5 + 6j)]이다.목록의 다른 모든 요소 합계/다른 모든 요소 전환 복잡함

목록을 [1, 3, 5]와 [2, 4, 6]의 두 목록으로 나눌 수 있지만 원하는 형식으로 결합하려고하면 두 가지 문제가 발생합니다. i) 두 번째 목록을 1j로 반환하고 오류를 반환합니다. "형식이 'complex'가 아닌 정수로 시퀀스를 곱할 수 없습니다. ii) 목록은 [1, 3, 5, 2, 4, 6] 형식이어야합니다. 연결합니다.

내가 2048 개의 요소를 가진 목록을 가지고 작업하고 있다고 가정하면, 분명히 크기가 개별적으로 원하는 형식의 데이터를 개별적으로 입력하게되므로이 문제에 대한 빠른 해결책을 제안 할 수 있습니다.

답변

6

사용 zip() 및 슬라이싱 :

In [72]: lis=[1, 2, 3, 4, 5, 6] 

In [73]: [complex(a,b) for a,b in zip(lis[::2],lis[1::2])] 
Out[73]: [(1+2j), (3+4j), (5+6j)] 
또는

:

In [74]: [complex(lis[i],lis[i+1]) for i in range(0,len(lis),2)] 
Out[74]: [(1+2j), (3+4j), (5+6j)] 

또는 반복자 메모리 효율적인 솔루션 사용 :

In [76]: it=iter(lis) 

In [77]: [complex(next(it),next(it)) for _ in range(len(lis)/2)] 
Out[77]: [(1+2j), (3+4j), (5+6j)] 
+0

눈부심. 많은, 많은 감사합니다. 나는 zip()을 사용해 보았지만 [(1,2), (3,4), (5,6)] 형태로 끝났으며 잘게 자르는 것에 대해 전혀 몰랐습니다. 고마워. – docar

+1

@docar 기꺼이 도와주었습니다. 그러나 큰 목록의 경우 메모리에 두 개의 목록을 만들고 다른 두 가지 솔루션보다 속도가 느리기 때문에 슬라이스 (zip + slicing)를 사용하지 마십시오. –