2012-05-16 4 views
22

, 난, 난 그냥 .. 같은 일부 항목을 추가하거나보다, 내가 목록을 선언 할 수 있다는 사실을 알고 ... 같은 파이썬에서python으로 픽스 크기 목록을 만드는 방법은 무엇입니까? C++에서

int* a = new int[10]; 

을 배열을 만들 수 있습니다

l = [1,2,3,4] 
l = range(10) 

C++과 같이 지정된 크기로 목록을 초기화 할 수 있습니까?

+2

파이썬으로 목록을 선언하려면 _do_ _not_ _need_를 사용해야합니다. _want_ _to_ _use_ 할 때 초기화하십시오. – ronakg

+4

맞아, 왜 지구상에 필요한거야? – 0605002

+0

Python은 C++이 아닙니다. 당신은 정말로 당신이 생각하는 방식을 바꿀 필요가있다. 파이썬에서 고정 된 크기를 선언 할 필요가 없다. – WeaselFox

답변

28

(TL; DR :. 귀하의 질문에 대한 정확한 답은 numpy.empty 또는 numpy.empty_like이지만, 가능성이 상관하지 않고 myList = [None]*10000을 사용하여 멀리 얻을 수 있습니다)

간단한 방법

당신 모든 동일한 요소에 대한 목록을 초기화 할 수 있습니다. 의미 적으로 비 숫자 값을 사용하는 것이 의미가 있는지 여부 (나중에 사용하면 오류가 발생합니다. 좋은 점) 또는 0과 유사합니다 (비정상적입니까? 희소 행렬을 작성하는 경우 유용 할 수 있습니다.) 기본 '값이 0이어야하며 당신이 버그에 대해 걱정하지 않은 당신에게 달려있다 :

>>> [None for _ in range(10)] 
[None, None, None, None, None, None, None, None, None, None] 

(여기서 _, 당신은 i 그냥 변수 이름을 사용할 수도있다)

당신도 할 수 있습니다. 이렇게하시오.

>>> [None]*10 
[None, None, None, None, None, None, None, None, None, None] 

이것을 최적화 할 필요가 없습니다. 간단한 방법

최선의

>>> x = [] 
>>> for i in range(10): 
>>> x.append(i) 

성능 비교 : 당신은 또한 배열에 당신이 필요한 모든 시간을 추가 할 수 있습니다? python2.7에서

>>> def initAndWrite_test(): 
... x = [None]*10000 
... for i in range(10000): 
... x[i] = i 
... 
>>> def initAndWrite2_test(): 
... x = [None for _ in range(10000)] 
... for i in range(10000): 
... x[i] = i 
... 
>>> def appendWrite_test(): 
... x = [] 
... for i in range(10000): 
... x.append(i) 

결과 : 파이썬 3.2

>>> import timeit 
>>> for f in [initAndWrite_test, initAndWrite2_test, appendWrite_test]: 
... print('{} takes {} usec/loop'.format(f.__name__, timeit.timeit(f, number=1000)*1000)) 
... 
initAndWrite_test takes 714.596033096 usec/loop 
initAndWrite2_test takes 981.526136398 usec/loop 
appendWrite_test takes 908.597946167 usec/loop 

결과 :

initAndWrite_test takes 641.3581371307373 usec/loop 
initAndWrite2_test takes 1033.6499214172363 usec/loop 
appendWrite_test takes 895.9040641784668 usec/loop 

우리가 볼 수 있듯이, 그것은 모두 python2에서 관용구 [None]*10000을 할 가능성이 더와 python3.그러나 할당보다 복잡한 작업 (목록의 모든 요소를 ​​생성하거나 처리하는 작업이 복잡함)을 수행하면 오버 헤드가 의미없는 비용의 일부가됩니다. 즉, 이러한 최적화는 목록의 요소에 대해 합리적인 조치를 취하는 경우에 대해 조기에 걱정할 것입니다. 그들은 그 과정에서 뭔가 쓰는 메모리를 통해 이동하기 때문에


초기화되지 않은 메모리

이 모든 그러나 비효율적이다. C에서는 초기화되지 않은 배열이 임의의 가비지 메모리 (시스템에서 다시 할당 된 sidenote : 프로그램을 닫을 때 실수로 메모리를 할당하거나 실패 할 때 security risk이 될 수 있음)로 채워집니다. . C 언어의 제작자는 자동으로 메모리를 초기화하지 않는 것이 더 좋을 것이라고 생각했습니다. 올바른 선택이었습니다.

이것은 (예 : O(N)이기 때문에) 점근 속도 향상이 아니지만, 예를 들어 실제로 신경 쓰는 물건으로 덮어 쓰기 전에 전체 메모리 블록을 먼저 초기화 할 필요는 없습니다. 가능하다면 (의사 코드) x = list(size=10000)과 같습니다.

파이썬에서 비슷한 것을 원하면 numpy 숫자 행렬/N 차원 배열 조작 패키지를 사용할 수 있습니다. 구체적으로, numpy.empty 또는 numpy.empty_like

귀하의 질문에 대한 진정한 답변입니다.

+0

'_'은 범위를 반복 할 때 정말로 필요하지 않은 변수의 "멍청한"이름일까요? 나는'for range (10)'가 때때로 쓰여지기를 바란다. –

+0

'x = [[None]] * 10'은 "wrong"입니다. 'x [0] .append (1)'을 시도해보고 그 마법을 보아라. –

+0

@ Death-Stalker : 네, 저는 그것이 실제로 지적하고 설명하려고 시도한 것입니다 ("변경 가능한 객체로 작업하기"). 하지만 고맙습니다. 내 대답이 몹시 말로 표현되어 있다는 것을 깨닫게 해준 것 같습니다. 결정된. – ninjagecko

3

이렇게 목록을 초기화하는 것은 실제로 python 방식이 아닙니다. 어쨌든 다음과 같이 목록을 초기화 할 수 있습니다.

>>> l = [None] * 4 
>>> l 
[None, None, None, None] 
3

파이썬에는이 기능을 지원하는 기능이 내장되어 있지 않습니다. 내가 추가하는 것이 오버 헤드가 많은 을 추가 할 것이라고 생각하지 않을 정도로 실제로 최적화해야합니까?

그러나 l = [None] * 1000과 같은 작업을 수행 할 수 있습니다.

또는 발전기를 사용할 수 있습니다.

+0

맞아요. 파이썬의 메모리 관리에 익숙하지 않아 마음이 바뀔 것입니다. 감사합니다 ~ – wtm

1
your_list = [None]*size_required 
7

[None] * 10을 사용할 수 있습니다. 그러나 이것은 "고정 된 크기"가 아니며 추가, 제거 할 수 있습니다 ... 이것은 목록이 만들어지는 방법입니다.

너비를 고정하려면 튜플 (tuple([None] * 10))으로 만들 수 있지만 다시 변경할 수는 없습니다 (저장된 항목이 변경 가능한 경우에만 모든 경우가 아님).

요구 사항에 더 가까운 또 다른 옵션은 목록이 아니고 최대 길이가 collections.deque입니다. 최대 크기이지만 크기는 더 작을 수 있습니다.

그러나 목록을 사용하고 일을하는 "pythonic"방식에 익숙해집니다.

3

참고 또한 C++에서 배열을 사용할 때 파이썬에서 다른 방법으로 해결된다 다소 다른 요구했다 수도 있음 :

  1. 당신은 항목의 단지 컬렉션을 필요로 수도를; 파이썬은이 용도를 완벽하게 다룬다.
  2. 어레이 균질 품목이 필요할 수도 있습니다. 파이썬 목록은 이 아니며이 아니며 배열을 저장하는 좋은 방법은입니다.

파이썬 다른 깔끔한 것들 중에서 공지 된 크기의 배열를 제작하는 방법이, NumPy 의해 배열의 필요성을 해결한다 :

from numpy import * 

l = zeros(10) 
+6

'from numpy import * '를 사용하면 파이썬 내장 함수 인'all','abs','min','max','sum','any'와'round'를 numpy에 해당하는 것으로 숨길 수 있습니다. 당신이 원하는. –

+2

예,'numpy' 모듈에는 상당히 많은 이름이 포함되어 있습니다 (그럼에도 불구하고 배열 코드를 작성할 때 모듈 네임 스페이스에 두는 것이 편리합니다). 가능한 이름 충돌이 문제를 일으키는 경우 정규화 된 가져 오기를 사용하십시오. – ulidtko

0
fix_array = numpy.empty(n, dtype = object) 

n은 배열의 크기가

이긴하지만이 목적을 위해 라이브러리를 가져와야하므로 최선의 방법은 아닙니다. 희망이 도움이!

관련 문제