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

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

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

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

print  s1

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

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



답변

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]


답변

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

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))


답변

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]]


답변

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


답변

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

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


답변

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

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


답변

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

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이미 찾고있는 기능입니다. 다시, 목록을 “사전 크기 조정”할 필요는 없습니다.