리스트 기초 한 번에 익히기

앞 글에서는 input()으로 값을 받고 print()로 결과를 보여주는 방법을 살펴봤어요. 그런데 입력을 한 번 받고 끝나는 게 아니라, 여러 값을 모아 두고 싶을 때는 어떻게 할까요? 그럴 때 자주 만나는 게 리스트(List)입니다.

저도 처음에는 값 몇 개쯤 변수에 따로 담으면 되지 않나 싶었는데요. 항목이 늘어나기 시작하면 변수 이름 짓는 일부터 은근히 일이 되더라고요. 리스트에 차곡차곡 담아 두면 한데 모아 다루기가 훨씬 편합니다.

리스트는 여러 값을 담는 상자

여러 값을 한 상자에 모아 담는 리스트

리스트는 여러 값을 순서대로 모아 담는 자료 구조입니다. 파이썬에서는 대괄호 []를 쓰고, 값 사이는 쉼표로 구분해요.

fruits = ["사과", "바나나", "포도"]
empty_list = []

리스트에는 숫자, 문자열처럼 서로 다른 종류의 값도 들어갈 수 있습니다.

mixed = ["민지", 28, True]

문법상 가능하다고 해서 종류를 마구 섞는 게 늘 좋은 건 아니에요. 과일 목록이라면 과일 이름만 담는 식으로, 무엇을 모아 둔 리스트인지 일정하게 유지하면 나중에 코드를 읽고 다루기 쉬워집니다.

리스트가 비어 있는지, 값이 몇 개 있는지도 확인할 수 있어요.

fruits = ["사과", "바나나", "포도"]
print(len(fruits))  # 3

len()은 리스트에 든 항목 수를 알려줍니다. 직접 값을 세다가 하나 빼먹는 저 같은 사람에게 꽤 고마운 함수죠.

인덱스로 원하는 값 찾기

리스트의 위치 번호와 항목을 보여주는 안내 이미지

리스트 안의 값은 인덱스로 찾습니다. 인덱스는 항목의 위치를 나타내는 번호인데, 파이썬은 첫 번째 위치를 0부터 세어요. 처음엔 좀 낯설지만 금방 익숙해집니다.

fruits = ["사과", "바나나", "포도"]
print(fruits[0])  # 사과
print(fruits[1])  # 바나나

끝에서부터 찾을 때는 음수 인덱스를 쓸 수 있습니다.

print(fruits[-1])  # 포도

fruits[3]처럼 실제로 없는 위치를 찾으면 IndexError가 납니다. 어? 분명 세 번째 값을 찾으려 했는데 왜 오류가 나지, 하고 당황하기 쉬운 지점이에요. 첫 위치가 0이라서 세 항목의 인덱스는 0, 1, 2라는 걸 기억하면 덜 헷갈립니다.

여러 항목을 한꺼번에 보고 싶다면 슬라이스도 쓸 수 있어요.

print(fruits[0:2])  # ["사과", "바나나"]

0:2는 0번부터 2번 직전까지, 즉 0번과 1번 항목을 가져옵니다. 끝 번호는 포함되지 않아요.

값을 바꾸고 항목을 추가하기

수정 전과 수정 후 리스트를 비교하는 이미지

리스트는 만든 뒤에도 내용을 바꿀 수 있습니다. 인덱스로 원하는 위치를 지정하고 새 값을 대입하면 돼요.

fruits = ["사과", "바나나", "포도"]
fruits[1] = "딸기"
print(fruits)  # ["사과", "딸기", "포도"]

새 항목을 맨 뒤에 붙일 때는 append()를 사용합니다.

fruits.append("귤")
print(fruits)  # ["사과", "딸기", "포도", "귤"]

여기서 한 번 실수하기 쉬운 게 있어요. append()는 리스트에 값을 추가하는 메서드라, 아래처럼 결과를 다시 대입하지 않아도 됩니다.

fruits.append("배")

항목을 지울 때는 값으로 지우는 remove()와 위치로 지우는 pop()이 있습니다.

fruits.remove("딸기")  # 값으로 찾아 삭제
last_fruit = fruits.pop()  # 마지막 항목을 꺼내며 삭제

remove()는 같은 값이 여러 개면 먼저 만나는 항목을 지워요. 그리고 리스트에 없는 값을 지우려 하면 오류가 날 수 있습니다. 처음엔 삭제 전에 그 값이 있는지 살펴보는 편이 안전해요.

입력값을 모아 나만의 목록 만들기

입력부터 출력까지 목록을 만드는 순서를 보여주는 이미지

앞에서 배운 입력과 출력을 리스트와 이어볼까요? input()으로 입력받은 값을 append()로 모으면 간단한 할 일 목록을 만들 수 있습니다.

tasks = []

for _ in range(3):
    task = input("할 일을 입력하세요: ")
    tasks.append(task)

print("오늘 할 일:")
for task in tasks:
    print("-", task)

for 반복문은 리스트에 든 항목을 하나씩 꺼내 처리합니다. 반복문을 아직 낯설게 느끼더라도, 리스트를 출력하거나 차례대로 보여줄 때 자주 만난다는 점만 먼저 챙겨두면 좋아요.

숫자를 입력받아 계산할 때는 한 가지 더 기억해야 합니다. input()의 결과는 문자열이므로 숫자로 쓰려면 int()나 float()로 바꿔야 해요.

scores = []
score = int(input("점수 입력: "))
scores.append(score)
print(scores)

리스트를 다룰 때는 아래를 확인하면 실수가 줄어요.

  • 첫 번째 인덱스는 0이다.
  • 인덱스가 실제 항목 범위 안에 있는지 확인한다.
  • append()는 항목 하나를 리스트 끝에 추가한다.
  • input()으로 받은 숫자는 필요하면 숫자형으로 바꾼다.

리스트는 순서가 있고, 만든 뒤에도 내용을 바꿀 수 있는 자료 구조입니다. 그래서 값이 늘거나 줄 수 있는 목록을 다룰 때 잘 맞아요. 그럼 내용을 바꿀 수 없는 자료 구조도 있을까요? 다음 글에서는 리스트와 비슷하게 여러 값을 담지만, 한 번 만든 뒤 바꾸지 못하는 튜플(Tuple)을 이어서 살펴보겠습니다. 리스트와 튜플을 나란히 놓고 보면 언제 어떤 걸 고를지 감이 좀 더 잘 올 거예요.

AIWD 소모임AI 자동화 오픈톡