Python 리스트 조작하기

PythonBeginner
지금 연습하기

소개

본 실습에서는 Python 에서 리스트 (list) 를 조작하는 실습 경험을 쌓게 됩니다. 리스트는 순서가 있는 항목 모음을 저장하는 기본적인 데이터 구조입니다. 리스트 요소를 생성, 접근, 추가, 제거 및 수정하는 방법을 배우게 됩니다.

또한, 본 실습에서는 정렬 (sorting), 쿼리 (querying), 리스트 중첩 (nesting lists) 과 같은 고급 연산들을 안내할 것입니다. 실습이 끝날 때쯤이면 Python 프로그램에서 데이터를 관리하고 처리하기 위해 리스트를 효과적으로 다루는 방법에 대해 탄탄한 이해를 갖게 될 것입니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 100%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

리스트 생성 및 접근

이 단계에서는 리스트를 생성하고 그 요소에 접근하는 방법을 배웁니다. 리스트는 순서가 있으며 변경 가능한 (mutable) 항목들의 모음이며, Python 에서 가장 다재다능한 데이터 타입 중 하나입니다.

리스트는 대괄호 []를 사용하여 생성하며, 항목들은 쉼표로 구분합니다. 몇 가지 리스트를 생성하는 것으로 시작하겠습니다.

왼쪽에 있는 WebIDE 파일 탐색기에서 ~/project 디렉토리에 있는 list_creation.py 파일을 찾아 엽니다. 파일에 다음 코드를 추가하십시오:

## Create an empty list
empty_list = []
print("Empty list:", empty_list)
print("Type of empty_list:", type(empty_list))

## Create a list of numbers
numbers = [10, 20, 30, 40, 50]
print("Numbers list:", numbers)

## Lists can contain elements of different data types
mixed_list = [1, 'hello', 3.14, True]
print("Mixed data type list:", mixed_list)

## You can also create a list from another iterable, like a string
string_list = list("python")
print("List from a string:", string_list)

코드를 추가한 후 파일을 저장합니다. 스크립트를 실행하려면 WebIDE 에서 통합 터미널을 열고 다음 명령을 실행하십시오:

python ~/project/list_creation.py

다양한 리스트 생성 방법을 보여주는 다음 출력을 보게 될 것입니다:

Empty list: []
Type of empty_list: <class 'list'>
Numbers list: [10, 20, 30, 40, 50]
Mixed data type list: [1, 'hello', 3.14, True]
List from a string: ['p', 'y', 't', 'h', 'o', 'n']

다음으로, 리스트 내 요소에 접근하는 방법을 살펴보겠습니다. 인덱스 (위치) 를 사용하여 요소에 접근할 수 있습니다. 리스트 인덱싱은 0부터 시작합니다. 또한 음수 인덱스를 사용할 수 있으며, 이때 -1은 마지막 요소를 참조합니다.

슬라이싱 (Slicing) 을 사용하면 요소 범위를 접근할 수 있습니다. 구문은 list[start:stop:step]입니다.

list_creation.py 파일 끝에 다음 코드를 추가하십시오:

## Accessing list elements
fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi']
print("\n--- Accessing Elements ---")
print("Fruits list:", fruits)

## Access the first element (index 0)
print("First element:", fruits[0])

## Access the last element (index -1)
print("Last element:", fruits[-1])

## Slicing: get elements from index 1 up to (but not including) index 4
print("Slice [1:4]:", fruits[1:4])

## Slicing: get all elements from the beginning up to index 3
print("Slice [:3]:", fruits[:3])

## Slicing: get all elements from index 2 to the end
print("Slice [2:]:", fruits[2:])

## Slicing: get a copy of the entire list
print("Slice [:] (a copy):", fruits[:])

## Slicing with a step: get every second element
print("Slice [::2]:", fruits[::2])

## Slicing to reverse the list
print("Reversed list [::-1]:", fruits[::-1])

파일을 저장하고 터미널에서 스크립트를 다시 실행하십시오:

python ~/project/list_creation.py

인덱싱과 슬라이싱이 어떻게 작동하는지 이해하기 위해 새로운 출력을 관찰하십시오:

Empty list: []
Type of empty_list: <class 'list'>
Numbers list: [10, 20, 30, 40, 50]
Mixed data type list: [1, 'hello', 3.14, True]
List from a string: ['p', 'y', 't', 'h', 'o', 'n']

--- Accessing Elements ---
Fruits list: ['orange', 'apple', 'pear', 'banana', 'kiwi']
First element: orange
Last element: kiwi
Slice [1:4]: ['apple', 'pear', 'banana']
Slice [:3]: ['orange', 'apple', 'pear']
Slice [2:]: ['pear', 'banana', 'kiwi']
Slice [:] (a copy): ['orange', 'apple', 'pear', 'banana', 'kiwi']
Slice [::2]: ['orange', 'pear', 'kiwi']
Reversed list [::-1]: ['kiwi', 'banana', 'pear', 'apple', 'orange']

이제 리스트를 생성하고 그 내용을 접근하는 방법을 배웠습니다.

리스트 수정: 요소 추가, 제거 및 변경

이 단계에서는 리스트를 수정하는 방법을 배웁니다. 리스트는 변경 가능 (mutable) 하므로 생성된 후에도 요소들을 추가, 제거 또는 변경할 수 있습니다.

먼저, 요소 추가에 중점을 두겠습니다. Python 은 여러 메서드를 제공합니다:

  • append(): 단일 요소를 리스트의 끝에 추가합니다.
  • extend(): 반복 가능한 객체 (예: 다른 리스트) 의 모든 요소를 끝에 추가합니다.
  • insert(): 특정 인덱스에 요소를 추가합니다.

WebIDE 파일 탐색기에서 list_modification.py 파일을 엽니다. 다음 코드를 파일에 추가하십시오:

## --- Adding Elements ---
my_list = [1, 2, 3]
print("Original list:", my_list)

## Add an element using append()
my_list.append(4)
print("After append(4):", my_list)

## Add multiple elements using extend()
my_list.extend([5, 6])
print("After extend([5, 6]):", my_list)

## Insert an element at a specific position
my_list.insert(1, 1.5) ## Insert 1.5 at index 1
print("After insert(1, 1.5):", my_list)

파일을 저장하고 터미널에서 실행하십시오:

python ~/project/list_modification.py

출력 결과는 각 연산으로 리스트가 증가하는 것을 보여줄 것입니다:

Original list: [1, 2, 3]
After append(4): [1, 2, 3, 4]
After extend([5, 6]): [1, 2, 3, 4, 5, 6]
After insert(1, 1.5): [1, 1.5, 2, 3, 4, 5, 6]

다음으로, 요소 제거를 연습해 보겠습니다. 주요 메서드는 다음과 같습니다:

  • remove(): 지정된 값의 첫 번째 발생 항목을 제거합니다.
  • pop(): 주어진 인덱스의 요소 (인덱스가 지정되지 않으면 마지막 요소) 를 제거하고 반환합니다.
  • del: 인덱스를 사용하여 항목이나 슬라이스를 제거하는 구문 (statement) 입니다.
  • clear(): 리스트의 모든 요소를 제거합니다.

list_modification.py 끝에 다음 코드를 추가하십시오:

## --- Removing Elements ---
fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple']
print("\n--- Removing Elements ---")
print("Original fruits list:", fruits)

## Remove the last element using pop()
popped_item = fruits.pop()
print("After pop():", fruits)
print("Popped item:", popped_item)

## Remove an element by its value using remove()
fruits.remove('pear')
print("After remove('pear'):", fruits)

## Remove an element by its index using del
del fruits[1] ## Deletes 'apple' at index 1
print("After del fruits[1]:", fruits)

## Clear all elements from the list
fruits.clear()
print("After clear():", fruits)

마지막으로, 인덱스나 슬라이스에 새 값을 할당하여 기존 요소를 변경할 수 있습니다. 이 마지막 코드 블록을 list_modification.py에 추가하십시오:

## --- Changing Elements ---
letters = ['a', 'b', 'c', 'd', 'e']
print("\n--- Changing Elements ---")
print("Original letters list:", letters)

## Change a single element
letters[0] = 'A'
print("After changing index 0:", letters)

## Change a slice of elements
letters[1:3] = ['B', 'C']
print("After changing slice [1:3]:", letters)

파일을 저장하고 스크립트를 다시 한 번 실행하십시오:

python ~/project/list_modification.py

전체 출력은 여러분이 배운 모든 수정 기술을 시연할 것입니다:

Original list: [1, 2, 3]
After append(4): [1, 2, 3, 4]
After extend([5, 6]): [1, 2, 3, 4, 5, 6]
After insert(1, 1.5): [1, 1.5, 2, 3, 4, 5, 6]

--- Removing Elements ---
Original fruits list: ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple']
After pop(): ['orange', 'apple', 'pear', 'banana', 'kiwi']
Popped item: apple
After remove('pear'): ['orange', 'apple', 'banana', 'kiwi']
After del fruits[1]: ['orange', 'banana', 'kiwi']
After clear(): []

--- Changing Elements ---
Original letters list: ['a', 'b', 'c', 'd', 'e']
After changing index 0: ['A', 'b', 'c', 'd', 'e']
After changing slice [1:3]: ['A', 'B', 'C', 'd', 'e']

이제 Python 리스트에서 요소를 추가, 제거 및 변경하는 데 능숙해졌습니다.

고급 리스트 연산: 정렬, 조회 및 중첩

마지막 단계에서는 정렬 (sorting), 정보 조회 (querying), 중첩 리스트 (nested lists) 작업 등 보다 고급 리스트 연산을 탐구합니다.

정렬부터 시작하겠습니다. sort() 메서드는 리스트를 제자리에서 (in-place) 수정합니다. 오름차순 또는 내림차순으로 정렬할 수 있습니다.

WebIDE 에서 list_operations.py 파일을 엽니다. 정렬을 시연하기 위해 다음 코드를 추가하십시오:

## --- Sorting Lists ---
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
print("--- Sorting Lists ---")
print("Original numbers list:", numbers)

## Sort the list in-place (ascending)
numbers.sort()
print("After sort():", numbers)

## Sort the list in descending order
numbers.sort(reverse=True)
print("After sort(reverse=True):", numbers)

## The reverse() method simply reverses the order, it does not sort
letters = ['a', 'b', 'c', 'd']
print("\nOriginal letters list:", letters)
letters.reverse()
print("After reverse():", letters)

파일을 저장하고 터미널에서 실행하십시오:

python ~/project/list_operations.py

출력 결과는 정렬되고 역순으로 된 리스트를 보여줍니다:

--- Sorting Lists ---
Original numbers list: [3, 1, 4, 1, 5, 9, 2, 6]
After sort(): [1, 1, 2, 3, 4, 5, 6, 9]
After sort(reverse=True): [9, 6, 5, 4, 3, 2, 1, 1]

Original letters list: ['a', 'b', 'c', 'd']
After reverse(): ['d', 'c', 'b', 'a']

다음으로, 정보를 찾기 위해 리스트를 조회하는 방법을 살펴보겠습니다.

  • count(): 값이 나타나는 횟수를 반환합니다.
  • index(): 값이 처음 나타나는 인덱스를 반환합니다.

list_operations.py에 다음 코드를 추가하십시오:

## --- Querying Lists ---
fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
print("\n--- Querying Lists ---")
print("Fruits list:", fruits)

## Count the occurrences of an element
apple_count = fruits.count('apple')
print("Count of 'apple':", apple_count)

## Find the index of the first occurrence of an element
banana_index = fruits.index('banana')
print("Index of first 'banana':", banana_index)

마지막으로, 중첩 리스트 (nested lists) 에 대해 살펴보겠습니다. 중첩 리스트는 다른 리스트를 요소로 포함하는 리스트입니다. 이는 행렬 (matrix) 이나 격자 (grid) 와 같은 2 차원 구조를 만드는 데 유용합니다.

이 마지막 코드 블록을 list_operations.py에 추가하십시오:

## --- Nested Lists ---
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
print("\n--- Nested Lists ---")
print("Matrix:", matrix)

## Access an entire inner list (a row)
first_row = matrix[0]
print("First row:", first_row)

## Access a specific element in the nested list
## To get the element '6', we access row 1, then column 2
element = matrix[1][2]
print("Element at matrix[1][2]:", element)

파일을 저장하고 마지막으로 스크립트를 실행하십시오:

python ~/project/list_operations.py

전체 출력은 정렬, 조회 및 중첩 리스트 접근을 시연할 것입니다:

--- Sorting Lists ---
Original numbers list: [3, 1, 4, 1, 5, 9, 2, 6]
After sort(): [1, 1, 2, 3, 4, 5, 6, 9]
After sort(reverse=True): [9, 6, 5, 4, 3, 2, 1, 1]

Original letters list: ['a', 'b', 'c', 'd']
After reverse(): ['d', 'c', 'b', 'a']

--- Querying Lists ---
Fruits list: ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
Count of 'apple': 2
Index of first 'banana': 3

--- Nested Lists ---
Matrix: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
First row: [1, 2, 3]
Element at matrix[1][2]: 6

이제 Python 리스트 작업을 위한 몇 가지 고급 기술을 숙달했습니다.

요약

본 실습 (lab) 에서는 Python 에서 리스트를 조작하는 기본 사항을 배웠습니다. 대괄호 []list() 생성자를 사용하여 리스트를 생성하는 것부터 시작했습니다. 리스트의 특정 항목이나 하위 집합을 검색하는 데 필수적인 인덱싱 (indexing) 과 슬라이싱 (slicing) 을 사용하여 리스트 요소에 접근하는 연습을 했습니다.

그런 다음 append(), extend(), insert()를 사용한 요소 추가, remove(), pop(), del을 사용한 요소 제거, 그리고 인덱스 및 슬라이스 할당을 통한 요소 변경 등 리스트를 수정하는 방법을 탐구했습니다. 마지막으로, sort()를 사용한 제자리 정렬 (in-place sorting), reverse()를 사용한 역순 변경, count()index()를 사용한 조회, 그리고 중첩 리스트를 사용한 데이터 구조화 등 고급 연산을 다루었습니다. 이제 Python 프로젝트에서 리스트를 효과적으로 사용하는 데 필요한 모든 것을 갖추었습니다.