2012-12-19 4 views
5

다음과 같은 작업을 수행하여 생성 한 튜플을 풀고 싶습니다. 결과는 하나의 단순한리스트에 불과합니다. 나는 2 ~ 3 라인의 원하는 결과를 얻을 수 있지만 반드시 oneliner list.comp가 있습니까?파이썬리스트 이해, 풀기 및 다중 연산

y = [(i, sqrt(i), i**3, some_operation_on_i, f(i), g(i)) for i in x] 

예 : 내가 할 수 있어야한다 : 내가 원하는 무엇

x = range(10) 
y = [(i,j**2) for i,j in zip(x,x)] 
>>>y 
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49), (8, 64), (9 
, 81)] 
>>> 

y = len(x)*[0] 
y[::2] = x 
y[1::2] = [i**2 for i in x] 

내가 더 일반적인 경우 필요하면 내가 원하는하지만 부여 수행 result = [0,0,1,1,2,4,3,9.....]

입니다 결과와 같은 직선리스트를 얻으려면 어디에서 하나씩 작업 (사각형)을 지정해야합니까? 이제 각 i 다음에 임의의 수의 작업이 있습니다.

답변

12
>>> import itertools 
>>> list(itertools.chain(*y)) 
[0, 0, 1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81] 
11

중첩 된 지능형리스트를 사용

result = [a for tup in y for a in tup] 

예 :

>>> x = range(10) 
>>> y = [(i,j**2) for i,j in zip(x,x)] 
>>> [a for tup in y for a in tup] 
[0, 0, 1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81] 

이뿐만 아니라 당신의 더 일반적인 경우에 잘 작동합니다, 또는 당신이 한 번에 모든 것을 할 수 :

y = [a for i in x for a in (i, sqrt(i), i**3, some_operation_on_i, f(i), g(i))] 

sted list comprehensions가 이상하게 보입니다. 여기가 정상적으로 보이는 모양입니다.

y = [] 
for i in x: 
    for a in (i, sqrt(i), i**3, some_operation_on_i, f(i), g(i)): 
     y.append(a) 
+0

중첩 목록을 완전히 잊어 버렸습니다. 감사합니다. 이것을 받아들이는 것이 더 빠른 방법이며 list.comp에서 수행합니다. 나는 그것이 어색하다는 데 동의하지만, 나는 당 4-5 개 이상의 작업이 필요할 것이라고 생각하지 않는다. – arynaq