파이썬의 list
1. 개요
C 유사 언어에서 둘 이상의 원소를 관리하는 가장 기본적인 변수 타입은 흔히 array라고 하는데, 파이썬에서는 이를 list라 한다. list는 내부적으로 구현이 array와 다소 다르기는 하지만 (파이썬에서 list로 선언된 변수의 원소들은 각 원소가 가리키는 데이터값의 주소와 다음 인덱스 원소가 있는 메모리 주소를 저장한다) 사용 방식은 C 유사 언어의 일반적인 배열과 거의 같다. (인덱스 번호로 list의 각 원소에 순차적으로 접근할 수 있다는 점이 특히 그렇다. 다만 파이썬의 list는 각 원소가 갖는 변수형을 서로 다르게 지정해도 된다는 점 등의 특징이 있어, 파이썬의 list는 자바스크립트의 Array와 유사하다.)
2. 선언
1) 일반적인 경우
1
2
list1 = []
list2 = [1, 2, 3, 4, 5]
2) for in 구문 이용(list comprehension)
generator expression을 쓸 때와 똑같이 for in 구문을 쓰고 구문 바깥쪽의 괄호쌍을 대괄호쌍([])으로 감싸면 그 구문이 리턴하는 객체가 list 객체가 된다. (이를 list comprehension이라 한다.)
3) list() 함수 이용
1
2
3
4
5
6
def getGenObj(param):
for i in range(param):
yield i
list1 = list(range(10))
list2 = list(getGenObj(10))
list() 함수는 인자로 받은 객체를 리스트형으로 변환하여 리턴하는 함수로, 이를 이용하여 여러 객체를 리스트로 형변환하여 선언할 수 있다.
(1) range() 함수로 선언한 range 객체를 list() 함수의 인자로 넣을 수 있다. 그러나 초기값을 range() 함수로 만든 등비수열 외에 다른 값으로 설정할 수 없다는 문제가 있다.
(2) yeild 예약어를 사용한 함수로 만든 generator 객체를 list() 함수의 인자로 넣을 수도 있다.
3. 인덱스를 통한 list 변수의 각 원소 호출 및 값 수정
1
2
list2[0] = 6
print(list2[0], list2[3], list2[-1], list2[-4])
- 6, 4, 5, 2가 출력된다. 파이썬의 list는 음수 인덱스로도 각 원소에 접근 가능한데, 절대값이 그 list의 크기를 넘어서는 정수로는 list의 원소에 접근할 수 없다. list의 크기가 N이라 하면, 그 list의 원소에 접근할 수 있는 정수의 범위는 -N부터 N-1까지다.
4. list의 병합
1
2
3
list1 = [1, 2]
list2 = [3, 4, 5] + list1
print(list2)
- list의 덧셈 연산은 두 리스트를 병합하는 연산으로 취급된다. 위 코드의 경우 [3, 4, 5, 1, 2]가 출력된다.
5. list의 부분 list 잘라내기(슬라이싱)
1
2
3
list3 = list2[1:2]
list4 = list2[::2]
list5 = list2[-1:]
- list 변수형의 대괄호 안에 콜론(:) 연산자를 써서 부분 list를 잘라낼 수 있다. 콜론 연산자 앞의 인덱스에서 콜론 연산자 뒤의 인덱스 바로 앞 인덱스까지 잘라낸 값이 리턴된다.
- 슬라이싱을 한다고 해서 슬라이싱 되는 기존 list 변수의 내부 원소가 줄어들거나 하는 것은 아니며 단지 지정된 범위의 값들을 복제한 부분 list를 만들어내는 것에 불과하다.
- 콜론 연산자 앞 또는 뒤에 쓰는 인덱스 번호를 list의 인덱스의 처음 또는 끝으로 쓰는 경우에는 이를 생략할 수 있다.
- 콜론 연산자를 두 개 쓰는 경우, 마지막 콜론 연산자 뒤의 숫자는 잘라낼 부분 list의 step으로 보아 주어진 범위의 첫 원소부터 주어진 step만큼 떨어진 원소들을 골라내 잘라낸다. 예를 들어, 위 코드의 list4에는 [3, 5, 2]가 저장된다.
- 대괄호 안에 [-1:]를 넘으면 그 리스트의 마지막 원소를 담은 부분 리스트가 리턴된다.
1
list2[1:3] = [0, 0]
- 위 코드처럼, 리스트의 일부를 슬라이싱한 부분에 대해서만 값을 새로 갱신하는 것도 가능하다.
6. list 복제
1
2
3
4
list1 = [1, 2, 3, 4, 5]
list2 = list1
list2[0] = 6
print(list1)
- list형으로 선언된 변수에 저장되는 것은 그 list의 주소값이기 때문에, 위 코드의 2번째줄처럼 단순히 list1의 이름을 list2 변수에 대입해봤자 list2 변수에 저장되는 것은 list1의 주소값이다. 즉 list1이 가리키던 list를 list2도 가리키게 하는 셈이므로, 3번째줄처럼 list2의 값을 변경 후 list1의 값을 출력해보게 하면 그 변경된 값이 반영되어 출력된다.
1
2
3
list2 = list1[:]
list2[0] = 6
print(list1)
- 콜론 연산자는 list를 새로 복제한다고 했으므로, 위 코드와 같이 콜론 연산자로 list1을 복제하여 list2에 대입하게 하면 list2의 값을 변경한다 해서 그것이 list1의 값을 변경시키지 않는다.
7. list 변수의 크기 구하기
1
2
list1 = [1, 2, 3, 4, 5]
print(len(list1))
len() 함수는 여러 객체의 크기를 리턴하는 파이썬의 내장함수다. 위 코드는 5가 출력된다.
8. list 변수의 일부 원소 삭제
1
2
del(list1[0])
print(list1)
del() 함수는 객체의 원소를 그 객체에서 삭제하는 파이썬의 내장함수다. 위 코드는 [2, 3, 4, 5]가 출력된다.
1
2
del(list1[:])
print(list1)
콜론 연산자를 이용해 list의 수개 원소를 동시에 삭제할 수 있다. 위 코드는 []가 출력된다.
1
2
list1 = [1, 2, 3, 4, 5]
print(list1.pop())
pop() 메서드는 list의 끝 원소를 삭제하고 그 값을 리턴하는 메서드다. 위 코드의 결과로 list1의 값은 [1, 2, 3, 4]가 되고 콘솔에는 5가 출력된다.
9. list에 원소 추가
1
2
list1 = [1, 2, 3, 4, 5]
list1.append(6)
append() 메서드는 그 list의 끝에 원소를 추가한다.
10. list의 원소 순서를 뒤집은 list 만들기
1
list2 = list1[::-1]
대괄호 안에 콜론 연산자를 두 번 쓰고 step 부분에 -1을 쓰면 원소 순서가 뒤집힌 list가 리턴된다.