본문 바로가기

프로그래밍/Python

[파이썬 / 기본] Lists

728x90
반응형

1. 리스트의 정의 및 생성

1.1 리스트의 특성

  • Python에서 리스트는 순서가 있는(ordered) 컬렉션 데이터 타입
  • 리스트의 가장 중요한 특징
    • 1. 수정 가능(Mutable): 생성 후에도 요소를 추가, 삭제, 변경할 수 있습니다.
    • 2. 중복 허용: 동일한 값을 가진 요소들을 여러 개 포함할 수 있습니다.
    • 3. 다양한 데이터 타입 허용: 정수(integer), 불리언(Boolean), 문자열(string) 등 서로 다른 데이터 타입을 한 리스트 안에 담을 수 있습니다.

1.2 리스트 생성 방법

  • 리스트는 **대괄호([])**를 사용하여 생성하며, 원하는 각 요소를 쉼표(comma)로 구분하여 넣습니다.
my_list = ["banana", "cherry", "apple"] # 예시

 

또한, list() 내장 함수를 사용하여 빈 리스트를 생성 가능
my_list_temp = list()

print(my_list_temp) # []

 

 

2. 요소 접근 및 반복 (Indexing and Iteration)

2.1 인덱스를 통한 접근

  • 리스트의 요소에 접근하려면 인덱스를 사용
  •  Python의 인덱스는 0부터 시작한다 (0이 첫 번째 항목).
item = my_list[0]
print(item) # "banana"
 
  • 음수 인덱스를 사용하면 리스트의 끝에서부터 요소를 참조 (-1은 리스트의 가장 마지막 항목)
item = my_list[-1]

print(item) # "apple"
  • 주의: 리스트의 범위를 벗어난 인덱스를 지정하면 IndexError: list index out of range 예외가 발생합니다.
my_list[10] # indexError

 

2.2 반복 및 포함 여부 확인

  • 리스트의 모든 요소를 순회하려면 간단히 for 루프를 사용
for item in my_list:
	print(item)
  • 특정 항목이 리스트 안에 포함되어 있는지 확인하려면 if와 in 키워드를 사용한 매우 단순한 구문을 사용합니다.
if "banana" in my_list:
    print("Yes") # 결과

 

3. 리스트를 위한 유용한 메서드

  • 리스트의 크기를 확인하거나 요소를 추가 및 제거하는 다양한 유용한 메서드가 있습니다.
메서드
기능
설명
len(my_list)
길이 확인
리스트에 있는 요소의 개수를 반환합니다.
my_list.append(item)
요소 추가
리스트의 **가장 마지막(끝)**에 새 항목을 삽입합니다.
my_list.insert(idx, item)
특정 위치 삽입
지정된 인덱스(idx)에 항목(item)을 삽입합니다.
my_list.pop()
마지막 요소 제거 및 반환
리스트의 마지막 항목을 반환하고 리스트에서 제거합니다.
my_list.remove(item)
특정 값 제거
리스트에서 지정된 **특정 요소(값)**를 제거합니다. 항목이 리스트에 없으면 ValueError가 발생합니다.
my_list.clear()
모든 요소 제거
리스트의 모든 요소를 제거하여 빈 리스트로 만듭니다.
my_list.reverse()
순서 뒤집기
리스트의 순서를 제자리에서(in place) 뒤집습니다.

 

 

4. 정렬 및 리스트 병합

4.1 정렬 (Sorting)

  • sort() 메서드를 사용하면 리스트를 오름차순으로 정렬할 수 있습니다.
  • 주의: sort() 메서드는 **원본 리스트를 직접 변경(in place sorting)**합니다.
  • 원본 리스트를 유지하면서 정렬된 새로운 리스트를 만들고 싶다면, **내장 함수 sorted()**를 사용해야
  • sorted() 함수는 원본 리스트를 인수로 받아 정렬된 새 리스트를 반환하며, 원본 리스트는 그대로 유지
# 원본 리스트
numbers = [5, 3, 8, 1, 2]

# sort() → 원본 리스트를 직접 변경 (in-place sorting)
numbers.sort()
print("sort() 결과:", numbers)
## 출력: sort() 결과: [1, 2, 3, 5, 8]

# 원본 리스트를 다시 초기화
numbers = [5, 3, 8, 1, 2]

# sorted() → 정렬된 새로운 리스트를 반환 (원본 유지)
sorted_numbers = sorted(numbers)
print("sorted() 결과:", sorted_numbers)
## 출력: sorted() 결과: [1, 2, 3, 5, 8]
print("원본 리스트:", numbers)
## 출력: 원본 리스트: [5, 3, 8, 1, 2]

 

4.2 리스트 생성 및 연결

  • 동일한 요소를 여러 번 반복하여 새 리스트를 만들려면 곱하기 연산자(*)를 사용
  • 두 리스트를 합치려면 더하기 연산자(+)를 사용하여 쉽게 연결
# 곱하기(*)를 사용한 리스트 반복
repeated = [0] * 5
print("리스트 반복:", repeated)
## 출력: 리스트 반복: [0, 0, 0, 0, 0]

# 더하기(+)를 사용한 리스트 연결
list1 = [1, 2, 3]
list2 = [4, 5]
combined = list1 + list2
print("리스트 연결:", combined)
## 출력: 리스트 연결: [1, 2, 3, 4, 5]

 

5. 슬라이싱 (Slicing)

  • 슬라이싱은 콜론(:)을 사용하여 리스트의 부분집합(sub parts)에 접근하는 매우 유용한 방법입니다.
  • 슬라이싱 구문은 [start:stop:step] 형식으로 지정합니다.
    • start 인덱스를 지정하지 않으면 리스트의 처음부터 시작합니다.
    • stop 인덱스를 지정하지 않으면 리스트의 끝까지 갑니다.
    • 가장 중요한 점은 stop 인덱스에 해당하는 항목은 결과에 포함되지 않고 제외(excluded)된다는 것입니다.
    • step 인덱스를 지정하여 건너뛰면서 항목을 선택할 수 있으며, 기본값은 1입니다. 예를 들어, step을 2로 설정하면 매번 두 번째 항목을 취합니다.
  • 유용한 트릭: **음수 step 인덱스(-1)**를 사용하면 리스트의 순서를 완전히 뒤집을 수 있음
nums = [10, 20, 30, 40, 50, 60]

# 기본 슬라이싱 [start:stop]
print("nums[1:4]:", nums[1:4])
## 출력: nums[1:4]: [20, 30, 40]   (인덱스 4는 제외됨)

# 처음부터 특정 인덱스까지
print("nums[:3]:", nums[:3])
## 출력: nums[:3]: [10, 20, 30]

# 특정 인덱스부터 끝까지
print("nums[3:]:", nums[3:])
## 출력: nums[3:]: [40, 50, 60]

# step 지정 (2칸씩 건너뛰기)
print("nums[::2]:", nums[::2])
## 출력: nums[::2]: [10, 30, 50]

# 음수 step 사용 (리스트 뒤집기)
print("nums[::-1]:", nums[::-1])
## 출력: nums[::-1]: [60, 50, 40, 30, 20, 10]

6. 리스트 복사 (Copying)의 중요성

  • 리스트를 다룰 때 **복사(copying)**는 매우 조심해야 하는 부분입니다.

6.1 단순 할당의 위험성

  • 단순히 = 연산자를 사용하여 할당하면 (예: copy = original), 두 변수는 메모리 내 동일한 리스트를 참조하게 됩니다.
  • 이 경우, 사본(copy)을 수정하면 원본 리스트도 함께 수정됩니다. 이는 두 리스트가 메모리 내 같은 객체를 가리키고 있기 때문입니다.
original = [1, 2, 3]
copy = original  # 단순 할당 → 같은 객체 참조
copy[0] = 99

print("copy 수정 후 original:", original)
## 출력: copy 수정 후 original: [99, 2, 3]   (같이 바뀜!)

6.2 실제 복사본 만들기 (Actual Copy)

  • 원본과 독립적인 실제 복사본을 만들려면 다음 세 가지 방법 중 하나를 사용해야 합니다:
    • 1. .copy() 메서드 사용: new_list = original.copy().
    • 2. list() 함수 사용: new_list = list(original).
    • 3. 전체 슬라이싱 사용: new_list = original[:] (시작부터 끝까지 슬라이싱).
original = [1, 2, 3]

# 1. .copy() 메서드
copy1 = original.copy()
copy1[0] = 99
print(".copy() 사용:", original, copy1)
## 출력: .copy() 사용: [1, 2, 3] [99, 2, 3]

# 2. list() 함수
copy2 = list(original)
copy2[1] = 88
print("list() 사용:", original, copy2)
## 출력: list() 사용: [1, 2, 3] [1, 88, 3]

# 3. 슬라이싱 [:]
copy3 = original[:]
copy3[2] = 77
print("슬라이싱 사용:", original, copy3)
## 출력: 슬라이싱 사용: [1, 2, 3] [1, 2, 77]

7. 고급 기법: 리스트 컴프리헨션 (List Comprehension)

  • 리스트 컴프리헨션은 기존 리스트로부터 새로운 리스트를 단 한 줄의 코드로 생성하는 빠르고 우아한(elegant) 고급 기술입니다.
  • 숫자 리스트의 모든 요소를 제곱한 새 리스트를 만들 때 유용합니다.
기본 구문: 리스트 컴프리헨션은 대괄호 안에 [표현식 for 항목 in 리스트] 형식으로 작성됩니다. 반복(iterating)과 마찬가지로, 항목 변수 이름은 자유롭게 지정할 수 있습니다.
# 예: 모든 요소 제곱
squared_list = [i * i for i in original_list]

 

728x90
반응형