2011-03-04 8 views
0

안녕 난이 같은 상황이 :파이썬 목록 혼란

>>> def get(): 
...  for i in range(3): 
...    yield [0] 
... 

과 내가이를 얻으려면 : [0,0,0]

내 코드는 지금이 방식으로 작동

:

>>> r = [] 
>>> r.extend(i[0] for i in get()) 
>>> r 
[0, 0, 0] 

하지만 나는 [0]을 좋아하지 않습니다. 몇 가지 조언이 있으십니까?

get는 오직 길이 그런 경우에는 1의 목록을 반환 괄호 삭제할 수 있습니다처럼 나에게

답변

1

r.extend을

이러한 종류의 필수 코드 (상태 업데이트, 내부 업데이트 포함)는 문제를 요구합니다.= '람다 얻을 :

from itertools import chain 

def flatten(listOfLists): 
    return chain.from_iterable(listOfLists) 

def get(): 
    for i in range(3): 
     yield [0] 

print(list(flatten(get()))) 
# [0, 0, 0] 
1

가이 보인다 (내가 python3에있어) :

>>> def get(): 
...  for i in range(3): 
...    yield 0 
>>> # Or, shorter ... 
>>> get = lambda: (0 for i in range(3)) 
>>> r = [] 
>>> r.extend(get()) 
>>> r 
[0, 0, 0] 
+0

또는 짧은 : 그 기능 flatten (concat)에 대한 표준을 사용하는 것 [0] * 3'. –

+0

@ Space_C0wb0y 아니요 코드가 짧지 만 생성기 대신 목록을 만듭니다. 3의 큰 값의 경우, 솔루션은 잠재적으로 불필요한 많은 메모리를 할당합니다. – phihag

+0

@philhag 나는 "3의 큰 값"= 수학을 재미있게 만들 수있는 아이디어를 좋아한다 :-) – neil

2

코드를 매우 이상하게 보입니다. 그러나 나는 그것이 매우 단순하다고 가정합니다. 그것은 단지 i[0] 치우는에 대해 있다면,이 작업을 수행 :

>>> def get(): 
...  for i in range(3): 
...    yield 0 
... 
>>> r = [] 
>>> r.extend(get()) 
>>> r 
[0, 0, 0] 
+2

왜 [i for get in()]? 이것은 불필요하게리스트를 할당하고, 'i for i'는 동어 반복이다. – phihag

+0

phihag : 힌트를 보내 주셔서 감사합니다. –

0

를 배열을 얻을하지 마십시오 하나하지 않으려는 경우 : 당신은 대신을 시도 할 수

>>> def get(): 
... for i in range(3): 
... yield 0 
... 
>>> r = [] 
>>> r.extend(i for i in get()) 
>>> r 
[0, 0, 0] 
+1

'r.extend (get())'으로 충분합니다. –

+0

사실, 꽤 맞습니다. –

0

을 :

def get(): 
    return [0] * 3 

r = [] 
r.extend(get()) 
r 
[0, 0, 0] 
0

???

def get(): 
    for i in xrange(3): 
     yield 0 

r = list(get()) 

print r 

또는

gen = (0 for i in xrange(3)) 

r = list(gen) 

print r 
+0

나는 [someint]를 생성하는 함수를 이미 가지고 있으며 수정할 수 없다. – nkint

1

당신이 get()list가 호출 될 때마다 1 크기를 반환 발전기이기 때문에 i[0]는 사용하는 데 그 이유. 코드 i[0] for i in get()i[0] for i in ([0],[0],[0])과 같습니다. 코드가 작동하는 이유는 i[0]이 반환 된 요소의 첫 번째 요소 인 자체를 list [0]으로 가져옵니다.

귀하의 질문에서 수집 한 것은 i for i in [0,0,0]입니다. 다른 답변에서 언급했듯이 이것은 list[0] 대신 int0이되도록 생성기를 변경하면 얻을 수 있습니다. 발전기가 [0]마다 반복 반환,

>>> for i in get(): 
... print("i={} and i[0]={}".format(i, i[0])) 
... 
i=[0] and i[0]=0 
i=[0] and i[0]=0 
i=[0] and i[0]=0 

당신이 볼 수 있듯이 그것은 각의 첫 번째 요소를 얻을 수 i[0]를 사용해야하는 이유는 다음과 같은 예제 코드에 발전기의 결과를 볼 수 있습니다 명부. r 발전기의 단지 결과가되기 때문에

, 당신은 다음을 수행하여 단순화 할 수 있습니다 : (GET에 내가 [0] 전을 위해())

>>> def gen(): 
... for i in range(3): 
...  yield 0 
... 
>>> r = list(gen()) 
>>> r 
[0, 0, 0]