여러 가지 자료들을 저장할 수 있는 자료형 중 하나이다.
지금까지 활용한숫자, 문자, 수식 등이 개별적인 자료라면, 리스트는 이런 자료들을 모아서 사용할 수 있게 해주는 특별한 형태의 자료형이다.
리스트를 생성하는 방식 : 대괄호에 자료를 쉼표(,)로 구분해서 입력한다.
리스트 구조 : [요소1, 요소2, 요소3, 요소4...]
대괄호 내부에 넣는 자료를 요소(element) 라고 한다.
# 숫자만으로 구성된 리스트
listNum = [1, 2, 3, 4]
# 문자열만으로 구성된 리스트
listStr = ["a", "b", "c"]
# 여러 자료형으로 구성된 리스트
listMix = [273, 32, 103.243, "문자열", True, False]
# 리스트의 인덱싱, 슬라이싱
listNum[0]
# 결과값
# 1
listNum[-1]
# 결과값
# 4
이중 리스트
# 이중 리스트
li = [1, 2, 3, ["a", "b", "c"]]
print(li[-1])
# 결과값
# ['a', 'b', 'c']
print(li[-1][0])
# 결과값
# a
print(li[:3])
# 결과값
# [1, 2, 3]
리스트 연산
문자열에 적용할 수 있는 연산자는 리스트에도 활용할 수 있다.
# 리스트 병합
a = [1, 2, 3]
b = [4, 5, 6]
print(a + b)
# 결과값
# [1, 2, 3, 4, 5, 6]
# 리스트 반복
print(a * 2)
# 결과값
# [1, 2, 3, 1, 2, 3]
리스트 수정 및 삭제
li = [1, 2, ,3, ["a", "b", "c"]]
# 요소를 인덱스로 삭제
del li[-1] # 슬라이싱도 사용 가능
print(li)
# 결과값
# [1, 2, 3]
# 수정
li[2] = 4
print(li)
# 결과값
# [1, 2, 4]
# remove 함수를 이용한 삭제
# remove 함수는 자신이 지우고싶은 value 값을 지정해서 지워야한다.
li.remove(4)
print(li)
# 결과값
# [1, 2]
# remove 함수는 리스트에서 첫 번째로 나오는 특정 요소를 삭제하는 함수
li = [1, 2, 3, 1, 2, 3]
li.remove(3)
print(li)
# 결과값
# [1, 2, 1, 2, 3]
# pop 함수를 이용한 삭제
# 제거할 위치를 입력하지 않으면 기본값(-1)을 적용해서
# 리스트의 맨 마지막 요소를 '반환'하고 해당 요소를 삭제
li = [1, 2, 3]
li.pop()
# 3
print(li)
# 결과값
# [1, 2]
# 특정 인덱스의 요소를 반환하는 것도 가능
li.pop(0)
# 1
print(li)
# 결과값
# [2]
리스트 관련 함수
1. append()
리스트 뒤에 요소를 추가할 때 사용하는 메서드이다.
li = [2]
li.append(5)
print(li)
# 결과값
# [2, 5]
li.append([1, 2, 3])
print(li)
# 결과값
# [2, 5, [1, 2, 3]]
2. insert()
괄호 안에서 정한 위치에 요소를 삽입하는 메서드이다.
해당 위치의 요소의 위치(index)는 뒤로 한칸씩 밀린다.
li = [1, 2, 3]
# 앞의 파라미터는 index, 뒤의 파라미터는 추가될 값
li.insert(0, 4)
print(li)
# 결과값
# [4, 1, 2, 3]
3. extend()
리스트 뒤에 새로운 리스트의 요소를 모두 추가할 떄 사용하는 메서드이다.
한 번에 여러 요소를 추가하고 싶을 때 주로 사용한다.
li = [4, 1, 2, 3]
li.extend([4, 5])
print(li)
# 결과값
# [4, 1, 2, 3, 4, 5]
4. index()
파라미터로 찾고싶은 값(value)을 넣고 그 값의 위치(index)가 어디인지 알고싶을 때 사용하는 메서드이다.
리스트에서 index의 값은 0부터 시작한다.
li = [1, 2, 3]
li.index(3)
# 결과값
2
5. count()
리스트에 포함된 요소의 갯수를 알고싶을 때 사용하는 메서드이다.
li = [1, 2, 3, 1]
li.count(1)
# 결과값
# 2
6. len()
리스트의 전체 길이를 알고싶을 때 사용하는 메서드이다.
li = [1, 2, 3, 1]
len(li)
# 결과값
# 4
7. clear()
리스트 내부의 모든 요소를 제거하고 싶을 때 사용하는 메서드이다.
li = [1, 2, 3]
li.clear()
print(li)
# 결과값
# []
리스트 연결 연산자와 리스트 확장의 차이
공통점 : 리스트 연결 연산자와 extend()함수는 리스트와 리스트를 연결해주는 비슷한 형태로 동작 한다.
차이점 : 리스트 연결 연산자(+)는 원본 리스트에 아무런 영향을 주지않지만(비 파괴적) extend()함수는 원본 리스트에 직접적인 영향을 준다.(파괴적)
기본적으로 자료는 비 파괴적으로 사용하는 것이 좋다.
왜냐하면 원본으로도 활용할 수 있고, 새로운 결과도 활용할 수 있으므로 선택지가 더 넓기 때문이다.
따라서 기본 자료형(숫자, 문자열, 불)과 관련된 것들은 비 파괴적으로 작동한다.
하지만 리스트는 용량이 매우 커질 수 있기 때문에 원본 리스트와 결과 리스트 두가지 상태를 다 생성하는 것은 위험할 수 있다.
이런 경우 원본 데이터를 직접 조작해서 위험을 회피해야 한다.
리스트 정렬
1. 리스트 오름차순 정렬
li = [1, 4, 3, 2]
li.sort()
print(li)
# 결과값
# [1, 2, 3, 4]
2. 리스트 내림차순 정렬
li = [1, 4, 3, 2]
li.sort(reverse = True)
print(li)
# 결과값
# [4, 3, 2, 1]
3. 리스트 뒤집기
# reverse() : 파괴적
li = ["a", "c", "b", "d"]
li.reverse()
print(li)
# 결과값
# ['d', 'b', 'c', 'a']
4. 슬라이싱 방식
li = ['d', 'b', 'c', 'a']
# 슬라이싱 방식 : 비파괴적
# li[시작:종료:증감값]
li[::-1]
# 결과값
# ['a', 'c', 'b', 'd']
print(li)
# 결과값
# ['d', 'b', 'c', 'a']