[Python] 파이썬 초보 탈출하자 #3 리스트 (上)

bokyungkim·2021년 11월 13일
1

값의 집합: 리스트

리스트는 값의 집합으로, 어떤 자료형이건 상관없이 리스트 안에 들어갈 수 있다. 리스트는 기본적으로 "리스트 이름= [요소1, 요소2, ...]"와 같은 형식으로 선언하고 초기화하며, 만약 비어있는 리스트를 선언하고 싶다면 "리스트 이름 = list()"라고 작성하면 된다.

oddnumber = [1, 3, 5, 7, 9]
cafes = ['star', 'bene', 'yoger', 'friends']
A = [1, 5, 'A', 'CC', 'B']
listInList = [[1, 3, 5, 6, 7], cafes, oddnumber, 1, 3, 'Abc']
  1. 리스트는 꼭 같은 자료형끼리 묶지 않아도 사용할 수 있다.
  2. 리스트 안에 리스트가 들어가는 것도 가능하다.

인덱싱

oddnumber = [1, 3, 5, 7, 9]
cafes = ['star', 'bene', 'yoger', 'friends']
A = [1, 5, 'A', 'CC', 'B']
listInList = [[1, 3, 5, 6, 7], cafes, oddnumber, 1, 3, 'Abc']

a = oddnumber[3]
b = cafes[1]
c = A[2]
d = listInList[0][1] #리스트 내 리스트 접근

print(a)
print(b)
print(c)
print(d)
print(a + d, oddnumber[4] * listInList[4]) #숫자 + 숫자 연산 가능
print(b + c) #문자열 + 문자열: 문자열 합하기
  1. 문자열 인덱싱과 마찬가지로 가장 앞에 있는 요소부터 0, 1, 2 ... 순차적으로 번호 인덱스를 부여받는다.
  2. 리스트 안의 리스트에 접근하려면 가장 바깥의 리스트의 인덱스에 먼저 접근한 뒤, 리스트 안에 포함된 리스트의 인덱스를 가져온다.
  3. 인덱싱한 값끼리 연산 또한 가능하다.

슬라이싱

oddnumber = [1, 3, 5, 7, 9]
cafes = ['star', 'bene', 'yoger', 'friends']
A = [1, 5, 'A', 'CC', 'B']
listInList = [[1, 3, 5, 6, 7], cafes, oddnumber, 1, 3, 'Abc']

a = oddnumber[1:5]
b = cafes[1:]
c = A[:2]
d = listInList[0][1:4] #리스트 내 리스트 접근

print(a)
print(b)
print(c)
print(d)
  1. 문자열 슬라이싱과 마찬가지로 앞쪽 범위 값을 생략했다면 가장 작은 인덱스 값을, 혹은 뒤쪽 범위 값을 생략했다면 가장 큰 인덱스 값을 자동으로 가져와 슬라이싱한다.
  2. 리스트 안의 리스트를 슬라이싱하고 싶다면 먼저 리스트 안에 있는 리스트를 인덱싱한 다음 원하는 범위를 작성하여 슬라이싱한다.

리스트 연산

리스트를 더하고 반복하는 예시

evennumbers = [2, 4, 6, 8, 10]
oddnumbers = [1, 3, 5, 7, 9]

numbers = evennumbers + oddnumbers
print(numbers)
# [2, 4, 6, 8, 10, 1, 3, 5, 7, 9]
print(numbers * 4)
# [2, 4, 6, 8, 10, 1, 3, 5, 7, 9, 2, 4, 6, 8, 10, 1, 3, 5, 7, 9, 2, 4, 6, 8, 10, 1, 3, 5, 7, 9, 2, 4, 6, 8, 10, 1, 3, 5, 7, 9]

리스트 수정

문자열은 Immutable 타입이기에 인덱싱으로 값을 수정할 수 없으나, 리스트에서는 얼마든지 가능하다. 먼저 요소를 수정하려면 "리스트 이름[인덱스값] = 수정값" 형식으로 코딩해야 한다.

numbers = [2, 4, 6, 8, 10, 1, 3, 5, 7, 9]

numbers[4] = 100
print(numbers)

numbers[2] = "hello"
print(numbers)

numbers[0] = numbers[9] #인덱스 9를 인덱스 0에 대입
print(numbers)

numbers[8] = ['a', 'b', 'c'] #리스트 전체를 형태 유지하며 대입
print(numbers)

리스트의 요솟값을 인덱싱을 이용해 수정할 때는 1대1 대응이다. 슬라이싱으로 수정할 때는 다르다.

numbers = [2, 4, 6, 8, 10, 1, 3, 5, 7, 9]

numbers[4:5] = [80]
print(numbers)

numbers[2:6] = "hello"
print(numbers)

numbers[2:3] = ['a','b','c'] 
print(numbers)

numbers[8] = ['a', 'b', 'c'] #리스트 전체를 형태 유지하며 대입
print(numbers)

numbers[:] = [1]
print(numbers)
  1. numbers[4:5]는 인덱스 4만 가져오지만 리스트로 판단되기 때문에, 슬라이싱으로 값을 수정할 때는 단일 값이 아닌 리스트로 대입해야 한다.
  2. numbers[2:6] = "hello"에서 "hello"는 하나의 문자열이자 문자 집합이다. 따라서 슬라이싱으로 값을 대입할 때 슬라이싱한 범위에 문자열의 문자를 순차적으로 하나씩 대입한다.
  3. numbers[2:3] = ['a', 'b', 'c']와 같이 슬라이싱한 범위에 리스트를 넣으면 대입할 리스트의 구성 요소들이 numbers에 완전히 포함된다. 그러나, numbers[8] = ['a', 'b', 'c']는 리스트 내 리스트 형태로 수정되었다. 인덱싱과 슬라이싱의 차이점을 확인하자.

리스트 삭제

리스트에서 요소만 삭제하려면 인덱싱과 슬라이싱으로 기존 요소를 빈칸으로 수정하면 된다. 예를 들어, 인덱싱은 a[4] = "", 슬라이싱은 a[1:3] = []와 같이 입력하면 그 공간은 공백으로 남게 된다.

numbers = [2, 4, 6, 8, 10, 1, 3, 5, 7, 9]

#값만 삭제
numbers[3] = ""
print(numbers)

del 키워드를 통한 삭제도 가능하지만, del 키워드는 객체 자체를 삭제한다는 차이를 가진다.

numbers = [2, 4, 6, 8, 10, 1, 3, 5, 7, 9]

a = "goorm"

#공간까지 삭제
del numbers[4]
print(numbers)

del numbers[:5]
print(numbers)

#객체 자체를 삭제
del a

헷갈렸던 부분...

슬라이싱으로 수정하는 범위가 이해되지 않았는데 해결됐다.
2:6 값을 주면 인덱스 2부터 5까지의 값을 하나씩 수정하는게 아니라, 원래 있던 값의 자리를 비워내고 새로운 값을 채운다고 생각하면 된다. 그래서 본래 변수 개수보다 더 많은 변수를 넣어줘도 문제가 없는 거다. 휴~


이 글은 goorm edu의 한 눈에 끝내는 파이썬3 기초 강좌를 참고하여 작성되었습니다.

0개의 댓글