파이썬에서 특정 크기의 빈 목록 만들기


545

10 개의 요소를 보유 할 수있는 빈 목록 (또는 가장 좋은 방법)을 만들고 싶습니다.

그 후 그 목록에 값을 할당하고 싶습니다. 예를 들어 0에서 9까지 표시해야합니다.

s1 = list();
for i in range(0,9):
   s1[i] = i

print  s1

그러나이 코드를 실행하면 오류가 발생하거나 다른 경우에는 [](비어 있음) 표시됩니다 .

누군가 이유를 설명 할 수 있습니까?



7
[]정의에 따라 "빈 목록"( )에는 요소가 없습니다. 당신이 분명히 원하는 것은 falsy 같은 값의 목록입니다 None, 0또는 ''.
dan04

에서 목록을 생성하려면 09실제로 사용해야 for i in range(0, 10)하는 수단을 for (int i = 0, i < 10, i++).
Atcold

답변:


830

lst[i] = something목록이 최소한 i+1요소로 초기화되지 않은 경우 와 같은 목록에 할당 할 수 없습니다 . 추가를 사용하여 목록 끝에 요소를 추가해야합니다. lst.append(something).

(사전을 사용하는 경우 할당 표기법을 사용할 수 있습니다).

빈 목록 만들기 :

>>> l = [None] * 10
>>> l
[None, None, None, None, None, None, None, None, None, None]

위 목록의 기존 요소에 값 지정 :

>>> l[1] = 5
>>> l
[None, 5, None, None, None, None, None, None, None, None]

같은 무언가가 있다는 사실을 숙지 l[15] = 5우리의 목록에 10 요소가로 여전히 실패합니다.

range (x)는 [0, 1, 2, ... x-1]에서 목록을 만듭니다.

# 2.X only. Use list(range(10)) in 3.X.
>>> l = range(10)
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

함수를 사용하여 목록 만들기 :

>>> def display():
...     s1 = []
...     for i in range(9): # This is just to tell you how to create a list.
...         s1.append(i)
...     return s1
... 
>>> print display()
[0, 1, 2, 3, 4, 5, 6, 7, 8]

목록 이해 (범위에 대해이 모든 것을 수행 할 필요가 없으므로 사각형을 사용하면을 반환 할 수 있음 range(0,9)) :

>>> def display():
...     return [x**2 for x in range(9)]
... 
>>> print display()
[0, 1, 4, 9, 16, 25, 36, 49, 64]

17
"lst [i] = something 같은 목록에 할당 할 수 없습니다"는 무슨 뜻입니까? 물론 가능합니다! 할 수없는 것은 현재 목록 길이를 넘어 존재하지 않는 요소에 할당하는 것입니다
Sergey

5
"목록이 이미 i + 1 요소 이상으로 초기화되지 않은 경우"....
MrR

5
: 당신이 할 수있는a = [0 for _ in range(10)]
Kamiar

list () 함수를 사용 하여이 작업을 수행 할 수 있습니까?
Raul Chiarella

125

대신 이것을 시도하십시오 :

lst = [None] * 10

위의 그림은 각 위치가로 초기화되는 크기 10의 목록을 만듭니다 None. 그런 다음 요소를 추가 할 수 있습니다.

lst = [None] * 10
for i in range(10):
    lst[i] = i

틀림없이, 그것은 파이썬 작업 방식이 아닙니다. 더 나은 방법 :

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

또는 더 간단한 Python 2.x에서는 0에서 9 사이의 값으로 목록을 초기화하기 위해이 작업을 수행 할 수 있습니다

lst = range(10)

그리고 파이썬 3.x에서 :

lst = list(range(10))

2
이것에 대한 다른 좋은 점은 기본값으로 목록을 초기화 할 수 있다는 것입니다. lst = [''] * 10또는lst = [0] * 10
Anthony Manning-Franklin

2
이해 예제의 변형. 초기화시 배열의 모든 요소를 ​​비워야하는 경우 다음을 사용하십시오 arr = [None for _ in range(10)]..
Doug R.

85

varunl의 현재 허용되는 답변

 >>> l = [None] * 10
 >>> l
 [None, None, None, None, None, None, None, None, None, None]

숫자와 같은 비 참조 유형에 적합합니다. 불행히도 목록 목록을 만들려면 참조 오류가 발생합니다. Python 2.7.6의 예 :

>>> a = [[]]*10
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [0], [0], [0], [0], [0], [0], [0], [0], [0]]
>>> 

보시다시피 각 요소는 동일한 목록 객체를 가리키고 있습니다. 이 문제를 해결하기 위해 각 위치를 다른 객체 참조로 초기화하는 메소드를 만들 수 있습니다.

def init_list_of_objects(size):
    list_of_objects = list()
    for i in range(0,size):
        list_of_objects.append( list() ) #different object reference each time
    return list_of_objects


>>> a = init_list_of_objects(10)
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [], [], [], [], [], [], [], [], []]
>>> 

함수를 작성하는 대신이 작업을 수행하는 기본 내장 파이썬 방법이있을 수 있지만 그 기능이 무엇인지 잘 모르겠습니다. 기꺼이 정정 해 드리겠습니다!

편집 : 그것은 [ [] for _ in range(10)]

예 :

>>> [ [random.random() for _ in range(2) ] for _ in range(5)]
>>> [[0.7528051908943816, 0.4325669600055032], [0.510983236521753, 0.7789949902294716], [0.09475179523690558, 0.30216475640534635], [0.3996890132468158, 0.6374322093017013], [0.3374204010027543, 0.4514925173253973]]

19
append매우 자주 사용 하는 것이 이해력을 나열하는 데 열등하다고 들었습니다 . 를 통해 목록 목록을 만들 수 있습니다 [ [] for _ in range(10)].
M.Herzkamp

10
동일한 데이터를 가진 여러 차원 배열을 여러 번 반복하여 화를 냈기 때문에 찬성했습니다.이 답변을 찾기 전에 무슨 일이 있었는지 알 수 없었습니다. ^^ 왜 여기가 너무 낮은 지 이해할 수 없습니다.
Bregalad

19

당신은 할 수 .append(element)목록, 예를하려면 다음 s1.append(i). 현재하려는 s1[i]것은 존재하지 않는 요소 ( )에 액세스하는 것 입니다.


16

두 가지 "빠른"방법이 있습니다.

x = length_of_your_list
a = [None]*x
# or
a = [None for _ in xrange(x)]

나타납니다 [None]*x빠르다 :

>>> from timeit import timeit
>>> timeit("[None]*100",number=10000)
0.023542165756225586
>>> timeit("[None for _ in xrange(100)]",number=10000)
0.07616496086120605

당신이 범위 (예에 확인하는 경우하지만 [0,1,2,3,...,x-1]), 다음 range(x)가장 빠른 수 있습니다 :

>>> timeit("range(100)",number=10000)
0.012513160705566406

Python3 에서는 목록을 반환하지 않지만 반복자이므로 list(range(n))대신 사용해야 합니다 . range()[None] * n
Skillmon은 topanswers.xyz를 좋아합니다.

10

빈 목록을 만드는 간단한 방법을 제안하는 사람이 아무도 없습니다. 이것은 오래된 스레드이지만 완전성을 위해 이것을 추가합니다. 빈 목록 10 개가 생성됩니다.

x = [[] for i in range(10)]

7
위의 작업과 수행의 가장 중요한 차이점 x = [[]] * 10은 후자의 경우 목록의 각 요소가 SAME 목록 객체를 가리키고 있다는 것 입니다. 따라서 단순히 동일한 객체의 사본을 10 개 원하지 않으면 range10 개의 객체를 생성 할 때 기본 변형을 사용하십시오 . 나는이 구별이 매우 중요하다는 것을 알았다.
Mandeep Sandhu

6

(이것은 질문의 원래 버전을 기반으로 작성되었습니다.)

10 개의 요소를 보유 할 수있는 빈 목록 (또는 가장 좋은 방법)을 만들고 싶습니다.

사용 가능한 메모리 제한에 따라 모든 목록에 원하는 수의 요소가 포함될 수 있습니다. 문제 목록의 유일한 "크기"요소의 수를 현재 그것입니다.

그러나 내가 그것을 실행하면 결과는 []입니다

print display s1유효한 구문이 아닙니다. 당신이보고있는 것을 당신의 설명에 따라, 나는 당신이 의미 가정 display(s1)다음과 print s1. 이를 실행 s1하려면 함수에 전달할 전역 을 미리 정의해야합니다 .

전화를 걸면 display전달한 목록이 작성된대로 수정되지 않습니다. 당신의 코드는 " s1함수에 전달 된 것의 이름입니다. 이제 우리가 할 첫 번째 일은 그 일을 완전히 잊어 버리고 s1새로 생성 된 것을 참조하기 시작 list합니다. 이제 우리는 그것을 수정할 것입니다. list". 전달한 값에는 영향을 미치지 않습니다.

여기에 값을 전달할 이유가 없습니다. (실제로 함수를 작성해야 할 이유는 없지만 요점 옆에 있습니다.) 무언가를 "생성"하고자하므로 함수의 출력이됩니다. 설명하는 것을 만드는 데 정보가 필요하지 않으므로 정보를 전달하지 마십시오. 정보를 얻으려면,return 십시오.

그것은 당신에게 다음과 같은 것을 줄 것입니다 :

def display():
    s1 = list();
    for i in range(0, 9):
        s1[i] = i
    return s1

다음 문제는 range함수 가 끝점을 건너 뛰기 때문에 목록에 실제로 9 개의 요소 만 있다는 것 입니다. 참고 []list()세미콜론은 불필요 s1하고 변수의 이름이 좋지 않으며 range에서 시작 하는 경우 하나의 매개 변수 만 필요합니다 0.

def create_list():
    result = list()
    for i in range(10):
        result[i] = i
    return result

그러나 여전히 마크가 없습니다. range그런데 언어의 일부 일부 마법의 키워드되지 않습니다 fordef하지만, 대신이 함수의이. 그리고 그 함수가 무엇을 반환하는지 맞춰보십시오. 맞습니다-정수 목록입니다. 따라서 전체 기능이

def create_list():
    return range(10)

이제 우리는 왜 함수를 직접 작성할 필요가 없는지 알 수 있습니다. range이미 찾고있는 기능입니다. 다시, 목록을 "사전 크기 조정"할 필요는 없습니다.


4

초기화 된 목록을 만드는 가장 쉬운 방법이 이러한 답변에 속하지 않는다는 것이 약간 놀랍습니다. list함수 에서 생성기를 사용하십시오 .

list(range(9))

1
왜 누군가가 이것에 대해 언급했는지 궁금합니다 ... 나는 파이썬 멍청한 놈이며 나는이 길처럼 보이지만 아무도 아무 말도하지 않습니다. 어쩌면 범위 기능이 비쌀 수도 있습니까?
AFP_555

3
이 문제는이 답변이 질문에 따라 빈 목록을 만들지 않는다는 것입니다. range (9) 함수의 기능은 [0, 1, 2, 3, 4, 5, 6, 7,8]로 끝납니다. . 제구 시과의 목록을 인스턴스화하는 것이 아니라 바로 숫자를 채우는 것보다 유용 가정
Spcogg 두 번째

왜 포장 range(9)에를 list()? range(9)목록을 아직 반환 하지 않습니까?
Zyl

2
@Zyl range은 목록도 아니고 발전기도 아닙니다. 의 내장 불변 서브 클래스입니다 Sequence.
Nuno André

@ AFP_555 실제 질문은 실제로 질문에 대답하지 않고 의도하지 않은 나쁜 결과를 초래할 수 있기 때문에 더 많이 다운 투트되지 않은 이유라고 생각합니다.
eric

4

n중첩 된 목록 이해를 사용하여 2D 크기의 행렬을 만드는 간단한 방법 :

m = [[None for _ in range(n)] for _ in range(n)]

1

다음은 파이썬에서 2D 목록에 대한 코드입니다. 입력에서 행 수 :

empty = []
row = int(input())

for i in range(row):
    temp = list(map(int, input().split()))
    empty.append(temp)

for i in empty:
    for j in i:
        print(j, end=' ')
    print('')

-2

비슷한 문제를 검색하는 동안이 SO 질문을 발견했습니다. 2D 배열을 만든 다음 각 목록의 일부 요소 (2D 배열)를 dict의 요소로 바꿔야했습니다. 그런 다음 SO 질문을 발견 하여 나를 도왔습니다. 아마도 다른 초보자가 돌아 다니는 데 도움이 될 것입니다. 핵심 요령은 2D 배열을 numpy 배열로 초기화 한 다음 array[i,j]대신 사용하는 것입니다 array[i][j].

참고로 이것은 이것을 사용해야하는 코드입니다.

nd_array = []
for i in range(30):
    nd_array.append(np.zeros(shape = (32,1)))
new_array = []
for i in range(len(lines)):
    new_array.append(nd_array)
new_array = np.asarray(new_array)
for i in range(len(lines)):
    splits = lines[i].split(' ')
    for j in range(len(splits)):
        #print(new_array[i][j])
        new_array[i,j] = final_embeddings[dictionary[str(splits[j])]-1].reshape(32,1)

이제 우리는 목록 이해를 사용할 수 있다는 것을 알고 있지만 단순화를 위해 중첩 된 for 루프를 사용하고 있습니다. 이것이이 게시물을 발견하는 다른 사람들을 돕기를 바랍니다.


-2

함수로 더 재사용 할 수있게하십시오.

def createEmptyList(length,fill=None):
    '''
    return a (empty) list of a given length
    Example:
        print createEmptyList(3,-1)
        >> [-1, -1, -1]
        print createEmptyList(4)
        >> [None, None, None, None]
    '''
    return [fill] * length

-3
s1 = []
for i in range(11):
   s1.append(i)

print s1

목록을 만들려면 다음 대괄호를 사용하십시오. "[]"

목록에 무언가를 추가하려면 list.append ()


-3

이 코드는 10 개의 난수를 포함하는 배열을 생성합니다.

import random
numrand=[]
for i in range(0,10):
   a = random.randint(1,50)
   numrand.append(a)
   print(a,i)
print(numrand)

3
SO에 오신 것을 환영합니다. 귀하의 답변은 실제로 질문을 구체적으로 다루지 않습니다. stackoverflow.com/help/how-to-answer
Nick
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.