Python 리스트의 기본

python post logo 파이썬

이 글의 소스 샘플은 [Google Colab에서 Python 코드 실행하기] 글에서 언급한 환경을 이용하면 Python 프로그램을 PC에 설치하지 않더라도 Chrome, IE, Edge의 Browser에서 쉽게 Python프로그램을 실행하고 따라할 수 있습니다.

리스트의 정의

리스트를 정의하기 위해서는 ‘[]’ 대괄호 안에 요소라고 부르는 데이터값을 지정하며 각 요소는 콤마로 구분합니다. 각 요소에는 0부터 시작하는 인덱스가 부여되며 인덱스로도 요소를 이용할 수 있습니다.

exlist1=['var1','var2', 3, 4]
print(exlist1)

실행 결과는 다음과 같습니다.

['var1', 'var2', 3, 4]

요소를 하나도 저장하지 않은 리스트도 정의할 수 있습니다.

exlist2=[]

list함수를 이용해서 리스트를 작성할 수도 있습니다. list함수의 괄호 안에 있는 모든 문자가 하나씩 exvar1라는 리스트의 요소가 되어, 리스트를 출력하면 아래와 같은 결과를 확인할 수 있습니다.

exvar1=list('List Function')
print(exvar1)

실행 결과는 다음과 같습니다.

['L', 'i', 's', 't', ' ', 'F', 'u', 'n', 'c', 't', 'i', 'o', 'n']

요소를 인덱스로 호출

리스트에 존재하는 개개의 데이터를 ‘요소’라고 부릅니다. 요소에는 0을 시작으로 ‘인덱스’가 주어져 리스트를 대입한 변수(혹은 리스트 그 자체)에 ‘인덱스 번호’를 계속함으로써 개개의 요소에 액세스 할 수 있습니다.

exlist3=['A','BC','DEF']
exlist3[2]

실행 결과는 다음과 같습니다.

'DEF'

요소의 슬라이스

문자열에서와 마찬가지로 리스트에서 인덱스를 지정하는 대신에 [start:end:step]과 같은 형태로 특정 위치에 있는 복수 개의 문자를 한 번에 출력할 수 있습니다.

exlist3 = ['a', 'b', 'c', 'd', 'e', 'f']

#두번째 요소'b'부터 네번째 요소'd'의 직전까지 step을 1씩 증가시키며 출력
print(exlist3[1:3:1])

#start값을 0으로, step값을 1로 간주하여 첫번째 요소인 'a'부터 다섯번째 요소인 'e'의 직전까지 1씩 증가시키며 출력
print(exlist3[:4])

#step값을 1로 간주하여 다섯번째 요소인 'e'부터 마지막 요소까지 출력 
print(exlist3[4:])

#세번째 요소인 'c'부터 일곱번째 요소인 'f'의 직전까지 2씩 증가시키며 출력
print(exlist3[2:6:2])

실행 결과는 다음과 같습니다.

['b', 'c']
['a', 'b', 'c', 'd']
['e', 'f']
['c', 'e']

start를 생략하면 인덱스 0이 지정된 것으로 간주되고, end를 생략하면 가장 마지막 요소까지가 대상범위가 되며, step을 생략하게 되면 디폴트 값으로 1이 지정됩니다. 이는 모두 문자열의 슬라이스와 동일합니다.

요소의 변경

리스트의 요소는 값을 변경할 수 있습니다. exlist4의 첫번째 요소인 ‘source1’을 변경하는 예시입니다.

exlist4 = ['source1', 'source2', 'source3']
print(exlist4)
exlist4[0] = '1source'
print(exlist4)
print(exlist4[0])

실행 결과는 다음과 같습니다.

['source1', 'source2', 'source3']
['1source', 'source2', 'source3']
1source

슬라이스 한 결과에 대입할 수도 있습니다. 단, 대입할 수 있는 것은 리스트 등의 반복 가능 오브젝트입니다.

exlist5 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
exlist5[0:5] = [10, 11, 12, 13, 14]
print(intlist)
exlist5[0:2] = [20, 21, 22] 
print(intlist)
exlist5[0:6] = [0, 1, 2]
print(intlist)

실행 결과는 다음과 같습니다.

[10, 11, 12, 13, 14, 5, 6, 7, 8, 9]
[20, 21, 22, 12, 13, 14, 5, 6, 7, 8, 9]
[0, 1, 2, 5, 6, 7, 8, 9]

슬라이스 오브젝트로의 대입에서는 원래 오브젝트의 요소 개수와 대입하는 반복가능 오브젝트(리스트 등)의 요소수가 같지 않아도 괜찮습니다. 대입하는 쪽의 요소가 많으면 각자 해당하는 위치에 추가됩니다. 개수가 적으면 원래 목록에서 요소가 삭제됩니다.

리스트가 아닌 정수값 ‘1’을 대입하면 아래와 같이 에러(Type Error 예외)가 발생합니다.

exlist5[0:2] = 1
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-f704b1ffaf16> in <module>()
----> 1 exlist5[0:2] = 1 

TypeError: can only assign an iterable

step까지 지정했을 경우에는, 대입처와 대입원의 요소 개수가 일치할 필요가 있으므로 주의가 필요합니다.

exlist6 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
exlist6[0:10:2] = [10, 12, 14, 16, 18]
print(exlist6)

실행 결과는 다음과 같습니다.

[10, 1, 12, 3, 14, 5, 16, 7, 18, 9]

아래의 예시에서는 요소 개수가 다르기 때문에 Value Error가 발생합니다.

exlist6[0:10:2] = [20, 22]
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-10-6b7ab16e941c> in <module>()
----> 1 exlist6[0:10:2] = [20, 22]

ValueError: attempt to assign sequence of size 2 to extended slice of size 5
제목과 URL을 복사했습니다