Akashic Records

[추가자료] 2.2 변수와 자료형 리스트(list) 함수들 본문

Python for Beginners

[추가자료] 2.2 변수와 자료형 리스트(list) 함수들

Andrew's Akashic Records 2024. 5. 23. 16:57
728x90

 

파이썬의 리스트 자료형은 다양한 데이터를 순차적으로 저장하는 데 사용되며, 여러 유용한 메서드를 제공합니다. 이러한 메서드들은 리스트를 수정하거나, 리스트의 내용을 조회하거나, 리스트의 요소들을 정렬하는 데 도움을 줍니다. 여기 몇 가지 기본적인 리스트 메서드들을 예제와 함께 설명하겠습니다.

 

1. 요소 추가 및 삭제

  • append(item): 리스트의 끝에 새로운 요소 item을 추가합니다.
  • extend(iterable): 리스트의 끝에 iterable의 모든 요소를 추가합니다.
  • insert(index, item): 리스트의 지정된 index 위치에 item을 삽입합니다.
  • remove(item): 리스트에서 첫 번째로 나오는 item을 제거합니다.
  • pop(index=-1): 리스트의 지정된 index 위치의 요소를 제거하고 그 요소를 반환합니다. index를 지정하지 않으면 마지막 요소를 제거합니다.
my_list = [1, 2, 3]
my_list.append(4)
print(my_list)  # [1, 2, 3, 4]

my_list.extend([5, 6])
print(my_list)  # [1, 2, 3, 4, 5, 6]

my_list.insert(0, 0)
print(my_list)  # [0, 1, 2, 3, 4, 5, 6]

my_list.remove(3)
print(my_list)  # [0, 1, 2, 4, 5, 6]

print(my_list.pop())  # 6
print(my_list)  # [0, 1, 2, 4, 5]

 

2. 검색 및 정렬

  • index(item): 리스트에서 item 요소가 처음으로 나타나는 위치를 반환합니다.
  • count(item): 리스트에서 item 요소가 나타나는 횟수를 반환합니다.
  • sort(): 리스트의 요소들을 오름차순으로 정렬합니다.
  • reverse(): 리스트의 요소들의 순서를 반대로 뒤집습니다.
my_list = [1, 2, 3, 2, 1]
print(my_list.index(2))  # 1
print(my_list.count(2))  # 2

my_list.sort()
print(my_list)  # [1, 1, 2, 2, 3]

my_list.reverse()
print(my_list)  # [3, 2, 2, 1, 1]

 

3. 복사

  • copy(): 리스트의 얕은 복사본을 반환합니다.
my_list = [1, 2, 3]
new_list = my_list.copy()
print(new_list)  # [1, 2, 3]

 

리스트의 "얕은 복사본(Shallow Copy)"이란 원본 리스트의 객체에 대한 참조만을 복사하는 것을 의미합니다. 이 복사 방식에서는 원본 리스트의 요소들이 참조형 객체일 경우, 새 리스트는 원본 객체들의 참조(메모리 주소)를 공유하게 됩니다. 즉, 원본 리스트와 복사된 리스트 모두 같은 객체들을 가리키게 됩니다.

 

얕은 복사의 중요한 특징:

  1. 비원시 데이터 타입의 공유: 리스트의 요소가 변경 불가능한 데이터 타입(예: 숫자, 문자열, 튜플)인 경우에는 복사된 리스트에서 요소를 변경해도 원본 리스트에 영향을 주지 않습니다. 하지만 요소가 리스트나 딕셔너리 같은 변경 가능한 데이터 타입인 경우, 복사된 리스트의 해당 요소를 변경하면 원본 리스트의 요소도 함께 변경됩니다.
  2. 성능: 얕은 복사는 깊은 복사보다 메모리 사용과 실행 시간 측면에서 효율적입니다.

파이썬에서 얕은 복사 사용 예제:

파이썬에서 얕은 복사를 수행하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 copy() 메소드와 슬라이싱([:])을 사용하는 것입니다.

import copy

# 원본 리스트 생성
original_list = [1, 2, [3, 4]]

# copy() 메서드를 사용한 얕은 복사
shallow_copy1 = original_list.copy()

# 슬라이싱을 사용한 얕은 복사
shallow_copy2 = original_list[:]

# 리스트 내의 내부 리스트 수정
shallow_copy1[2][0] = "changed"

# 결과 출력
print("Original:", original_list)       # Original: [1, 2, ['changed', 4]]
print("Shallow Copy 1:", shallow_copy1) # Shallow Copy 1: [1, 2, ['changed', 4]]
print("Shallow Copy 2:", shallow_copy2) # Shallow Copy 2: [1, 2, ['changed', 4]]

이 예제에서 볼 수 있듯이, 내부 리스트(변경 가능한 객체)가 포함된 경우, 얕은 복사는 원본과 복사본이 내부 리스트를 공유합니다. 따라서 한 쪽에서 내부 리스트를 변경하면 다른 쪽에도 영향을 미칩니다.

 

이러한 특성 때문에, 변경 가능한 내부 객체들을 포함하는 복잡한 리스트나 다른 컬렉션을 복사할 때는 깊은 복사(deepcopy())를 고려해야 할 수 있습니다. 깊은 복사는 원본 객체뿐만 아니라 내부 객체까지 모두 새롭게 복제하므로, 복사본을 변경해도 원본에는 아무런 영향을 주지 않습니다.

 

파이썬에서 깊은 복사(deep copy)를 수행하는 방법은 주로 copy 모듈의 deepcopy() 함수를 사용합니다. 깊은 복사는 객체뿐만 아니라 그 객체가 가지고 있는 내부 객체들까지 모두 새롭게 복제하여, 원본 객체와 전혀 독립적인 복사본을 생성합니다. 이 방법은 내부에 중첩된 리스트나 딕셔너리 등의 변경 가능한(mutable) 데이터 타입이 포함된 경우에 특히 유용합니다.

 

깊은 복사 사용 예제

다음은 deepcopy() 함수를 사용하여 리스트의 깊은 복사를 수행하는 예제입니다:

import copy

# 원본 리스트 생성
original_list = [1, 2, [3, 4]]

# deepcopy() 함수를 사용하여 깊은 복사 수행
deep_copied_list = copy.deepcopy(original_list)

# 복사된 리스트에서 내부 리스트 수정
deep_copied_list[2][0] = "changed"

# 결과 출력
print("Original:", original_list)         # Original: [1, 2, [3, 4]]
print("Deep Copied List:", deep_copied_list)  # Deep Copied List: [1, 2, ['changed', 4]]

이 코드에서는 원본 리스트 original_list와 깊은 복사된 리스트 deep_copied_list가 완전히 독립적입니다. 따라서 deep_copied_list에서 내부 리스트를 수정해도 original_list에는 아무런 영향을 주지 않습니다.

깊은 복사의 주의점

  • 성능: 깊은 복사는 모든 내부 객체를 재귀적으로 복사해야 하기 때문에 메모리 사용량이 늘어나고, 처리 시간도 오래 걸릴 수 있습니다. 따라서 필요한 경우에만 사용하는 것이 좋습니다.
  • 순환 참조: 순환 참조가 있는 객체를 깊은 복사하려고 할 때는 주의가 필요합니다. deepcopy()는 순환 참조를 자동으로 처리할 수 있지만, 복잡한 객체 구조에서는 예기치 않은 문제가 발생할 수도 있습니다.

deepcopy()를 사용할 때는 이러한 특성을 고려하여 적절하게 사용해야 합니다. 보통 복잡한 객체 구조를 가진 경우나 변경을 하고 싶지 않은 원본 데이터를 보호할 때 깊은 복사를 사용합니다.

 

이처럼 파이썬의 리스트 메서드들은 리스트를 효과적으로 관리하고 조작할 수 있게 해줍니다. 이 메서드들을 활용하면 데이터 컬렉션을 다루는 데 있어 매우 유연하고 효율적인 작업이 가능합니다.

 

리스트를 순회참조 예시코드

리스트를 순회하는 프로그램을 작성할 때, 파이썬에서는 for 루프를 주로 사용합니다. 여기서는 기본적인 예제와 더 응용된 예제 두 가지를 제공하겠습니다.

 

기본 순회 예제

다음 코드는 리스트의 모든 요소를 출력하는 간단한 예제입니다.

# 리스트 정의
fruits = ["apple", "banana", "cherry", "date"]

# 리스트의 각 요소를 순회하며 출력
for fruit in fruits:
    print(fruit)

이 코드는 리스트 fruits에 있는 각 과일 이름을 순차적으로 출력합니다.

 

조금 더 응용된 순회 예제

리스트의 요소와 함께 인덱스도 출력하고 싶은 경우, enumerate() 함수를 사용할 수 있습니다. 이 함수는 각 요소와 그 요소의 인덱스를 튜플로 반환합니다.

# 리스트 정의
fruits = ["apple", "banana", "cherry", "date"]

# enumerate()를 사용하여 리스트의 인덱스와 요소를 함께 순회
for index, fruit in enumerate(fruits):
    print(f"{index}: {fruit}")

이 예제는 각 과일의 이름 앞에 0부터 시작하는 인덱스를 함께 출력하여, 리스트의 요소가 어느 위치에 있는지 쉽게 알 수 있도록 합니다.

 

조건을 포함한 순회 예제

리스트에서 특정 조건을 만족하는 요소만 출력하고 싶을 때, if 문을 추가할 수 있습니다.

# 리스트 정의
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 숫자가 5보다 큰 경우에만 출력
for number in numbers:
    if number > 5:
        print(number)

이 코드는 numbers 리스트에서 5보다 큰 숫자만 출력합니다.

 

위와 같은 방법으로 리스트를 다양하게 순회하면서 필요한 작업을 수행할 수 있습니다. 리스트 순회는 파이썬에서 자주 사용되는 기법 중 하나이므로, 이러한 기본적인 패턴을 익혀두면 많은 상황에서 활용할 수 있습니다.

728x90
Comments