리스트는 다른 언어의 배열과 같은 역할을 하는 기본 자료구조이다.
하지만 파이썬의 리스트는 배열과는 달리 여러 강력한 기능들을 제공한다.
선언
my_list = [] # 빈 리스트 선언
my_list2 = [1, 2, 3, 4] # 정수형 데이터를 넣은 리스트
my_list3 = [1, 'hello', [2,3,4]] # 여러 타입의 데이터를 넣은 리스트
위와같이 리스트는 기본적으로 대괄호안에 데이터를 콤마(,)로 구분하여 생성 가능하다. 특이하게도 하나의 리스트에
들어갈 데이터들간에 타입이 통일되어야 할 필요는 없으며 숫자형 같은 기본적인 자료는 물론 리스트나 튜플 등의
자료구조도 iterable하다면 무엇이든 리스트에 들어갈 수 있다.
참조
my_list = [1, 3, 5, 7, 9]
print(my_list[3]) # 실행결과 : 7
my_list[2] = 4
print(my_list) # 실행결과: [1, 3, 4, 7, 9]
리스트의 참조는 C나 Java의 배열과 동일하게 <리스트>[인덱스] 의 형태로 이루어진다.
값의 변경은 <리스트>[변경할_데이터의_인덱스] = <변경할_값> 의 형태로 가능하다.
삽입
1. append
my_list = [1, 2, 3, 4, 5]
my_list.append(6)
print(my_list) # 실행결과 : [1, 2, 3, 4, 5, 6]
리스트의 끝에 데이터를 삽입할 경우 리스트에 내장된 append 메소드를 사용한다. append 함수에 전달할 인자로는
숫자형 등의 기본 자료형이나 문자열, 리스트, 튜플 등의 iterable한 자료구조들을 사용할 수 있다.
2. insert
my_list = [1, 2, 3, 4, 5]
my_list.insert(2, 6)
print(my_list) # 실행결과 : [1, 2, 6, 3, 4, 5]
리스트의 원하는 인덱스에 데이터를 삽입할 경우 리스트에 내장된 insert 메소드를 사용한다.
위 코드에서 my_list.insert(2, 6)을 호출하여 인덱스 2에 데이터값 6을 삽입한 것을 확인할 수 있다.
확장
my_list = [1, 2, 3, 4, 5]
my_list.append([6, 7, 8, 9])
print(my_list) # 실행결과 : [1, 2, 3, 4, 5, [6, 7, 8, 9]]
my_list2 = [1, 2, 3, 4, 5]
my_list2.extend([6, 7, 8, 9])
print(my_list2) # 실행결과 : [1, 2, 3, 4, 5, 6, 7, 8, 9]
append 메소드에 인자로 iterable한 인스턴스를 전달할 경우 그 인스턴스 자체가 하나의 데이터로서 삽입된다.
하지만 extend 메소드를 사용할 경우 전달된 인스턴스 내부의 데이터를 각각 리스트에 삽입한 결과를 얻을 수 있다.
삭제
1. del 명령어
my_list = ['alice', [2, 3, 4, 5], 7]
print(my_list) # 실행결과 : ['alice', [2, 3, 4, 5], 7]
del my_list[1]
print(my_list) # 실행결과 : ['alice', 7]
리스트의 기본적인 데이터 삭제는 del 명령어를 사용할 수 있다. del <리스트>[삭제할_데이터의_인덱스] 의 형태이다.
2. pop 메소드
my_list = [1, 2, 3, 4, 5]
print(my_list) # 실행결과 : [1, 2, 3, 4, 5]
print(my_list.pop()) # 실행결과 : 5
print(my_list) # 실행결과 : [1, 2, 3, 4]
리스트에 내장된 pop 메소드를 사용할 경우 stack과 같이 가장 마지막의 데이터를 반환하고 리스트 내에서 삭제한다.
append 메소드와 pop 메소드만을 사용해서 값의 삽입/삭제를 실행할 경우 리스트를 stack과 동일하게 사용 가능하다.
3. remove 메소드
my_list = [1, 3, 2, 4, 5]
print(my_list) # 실행결과 : [1, 3, 2, 4, 5, 3]
my_list.remove(3)
print(my_list) # 실행결과 : [1, 2, 4, 5, 3]
리스트에 내장된 remove 메소드는 인자로 넘겨준 데이터와 리스트의 데이터들을 대조하여 처음으로 발견된
동일한 데이터를 삭제한다.
4. clear 메소드
my_list = [1, 3, 2, 4, 5, 3]
print(my_list) # 실행결과 : [1, 2, 3, 4, 5]
my_list.clear()
print(my_list) # 실행결과 : []
리스트에 내장된 clear 메소드는 리스트 내의 모든 데이터를 삭제한다. 결과는 del <리스트>[ : ]를 호출한 것과 같다.
슬라이싱
my_list = ['zero', 'one', 'two', 'three', 'four', 'five']
my_sub_list = my_list[2:5]
print(my_sub_list) # 실행결과 : ['two', 'three', 'four']
리스트에서 원하는 구간만을 가져올 경우 <리스트>[첫_인덱스 : 마지막_인덱스+1] 의 형태로 슬라이싱이 가능하다.
위 코드와 같이 구간을 [2 : 5] 로 지정할 경우 인덱스 2부터 4까지 총 세개의 데이터를 잘라서 반환한다.
정렬
1. sort()
my_list = [1, 4, 2, 5, 3]
print(my_list) # 실행결과 : [1, 4, 2, 5, 3]
my_list.sort()
print(my_list) # 실행결과 : [1, 2, 3, 4, 5]
리스트에는 리스트에 들어있는 데이터들을 정렬해주는 sort() 메소드가 내장되어있다. sort() 메소드를 호출할 경우
리스트에 들어있는 값들이 모두 서로 비교 가능하다면 기준에 맞게 오름차순으로 정렬해준다.
2. sorted()
my_list = [1, 4, 2, 5, 3]
print(my_list) # 실행결과 : [1, 4, 2, 5, 3]
my_list_sorted = sorted(my_list)
print(my_list) # 실행결과 : [1, 4, 2, 5, 3]
print(my_list_sorted) # 실행결과 : [1, 2, 3, 4, 5]
리스트를 정렬하는 방법으로 sorted() 라는 메소드도 존재한다. 이 메소드는 인자로 정렬하려는 리스트를 전달하여
호출하면 원본 리스트는 건드리지 않고 정렬한 결과만을 리스트의 형태로 반환하는 메소드이다.
위 코드를 실행해보면 원본인 my_list는 그대로지만 sorted() 메소드의 반환값을 저장한 my_list_sorted는 정렬된 상태로
출력되는 것을 확인할 수 있다.
3. 추가인자 - reverse
# 추가인자 reverse
my_list = [1, 4, 2, 5, 3]
print(my_list) # 실행결과 : [1, 4, 2, 5, 3]
my_list.sort(reverse=True)
print(my_list) # 실행결과 : [5, 4, 3, 2, 1]
sort(), sorted() 메소드에 추가인자로 reverse 값을 전달할 수 있다. 위 코드처럼 reverse 값으로 True를 전달할 경우
정렬조건을 반대로 하여 내림차순 정렬이 되는 것을 확인할 수 있다.
4. 추가인자 - key
# 추가인자 key
my_list = [[1, 3], [5, 2], [5, 1], [6, 4], [2, 7]]
my_list_sorted1 = sorted(my_list, key = lambda x : x[0])
my_list.sort(key = lambda x : (-x[0], x[1]))
print(my_list) # 실행결과 : [[6, 4], [5, 1], [5, 2], [2, 7], [1, 3]]
print(my_list_sorted1) # 실행결과 : [[1, 3], [2, 7], [5, 2], [5, 1], [6, 4]]
sort(), sorted() 메소드에 추가인자로 key 값을 전달할 수도 있다. key는 정렬의 기준을 제시하는 함수이다.
위 코드는 람다함수를 key로 전달하여 my_list_sorted1 에는 리스트의 첫 인자를 기준으로 오름차순 정렬한 결과를,
my_list에는 리스트의 첫 인자를 기준으로는 내림차순, 첫 인자가 같다면 둘째 인자를 기준으로 오름차순 정렬한 결과를
저장한 것이다.
카운팅
my_list = [1, 3, 2, 4, 5, 3, 3]
how_many_three = my_list.count(3)
print(how_many_three) # 실행결과 : 3
리스트에 내장된 count 메소드는 인자로 전달된 데이터와 같은 데이터가 리스트 내부에 몇개 있는지 반환한다.
위 코드에선 my_list에 3이 3개 존재하기 때문에 3이 반환되는 것을 볼 수 있다.
복사 ( 대입, list.copy(), copy.deepcopy() )
import copy
my_list = [1, 2, 3, 4, [5, 6, 7, 8]]
my_list_copy1 = my_list # 단순 대입
my_list_copy2 = my_list.copy() # 얕은 복사
my_list_copy3 = copy.deepcopy(my_list) # 깊은 복사
my_list[0] = 9
my_list[4][0] = 7
print(my_list_copy1) # 실행결과 : [9, 2, 3, 4, [7, 6, 7, 8]]
print(my_list_copy2) # 실행결과 : [1, 2, 3, 4, [7, 6, 7, 8]]
print(my_list_copy3) # 실행결과 : [1, 2, 3, 4, [5, 6, 7, 8]]
단순대입으로 복사한 my_list_copy1 의 경우 원본과 같은 인스턴스를 가리키기 때문에 my_list의 변경이 모두 반영된다.
얕은복사본을 저장한 my_list_copy2 의 경우 리스트의 내장메소드인 copy를 사용하여 my_list와는 별도의 인스턴스지만
마지막 데이터인 리스트 [5, 6, 7, 8]의 경우 같은 인스턴스를 가리키기 때문에 my_list의 두 번째 변경이 반영된다.
깊은복사본을 저장한 my_list_copy3의 경우 copy 모듈의 deepcopy 메소드를 사용하여 리스트 데이터도 값만 같은
별도의 인스턴스를 가리키기 때문에 my_list에 가해진 변경이 일체 영향을 미치지않는 것을 볼 수 있다.
copy 모듈에 대해서는 추후 모듈에 대해 공부할 때 추가적으로 정리하도록 한다.
'언어 > Python' 카테고리의 다른 글
#5 집합(Set) (0) | 2021.03.02 |
---|---|
#4 딕셔너리(Dictionary) (0) | 2021.02.25 |
#3 튜플(Tuple) (0) | 2021.02.24 |
#1 기본적인 문법 (0) | 2021.02.23 |
0# Python 공부시작 (0) | 2021.02.23 |