def my_function(some_list):
some_list[0] = 999 # 복사본을 수정하므로 원본은 안전함
original_list = [1, 2, 3]
# 함수 호출 시 [:] 를 붙여서 복사본을 전달
my_function(original_list[:])
print(original_list) # 출력: [1, 2, 3] (변경되지 않음)
def my_function(data):
# 함수 안에서 복사본을 만들어 사용 (new_data는 별개의 리스트)
new_data = data.copy()
new_data.append(4)
return new_data
original = [1, 2, 3]
my_function(original)
print(original) # 출력: [1, 2, 3]
python
import copy
def my_function(data):
# 내부의 리스트까지 싹 다 새로 복사
new_data = copy.deepcopy(data)
new_data[0][0] = 999
original = [[1, 2], [3, 4]]
my_function(original)
print(original) # 출력: [[1, 2], [3, 4]] (깊은 복사 덕분에 안전)
data = [3, 1, 2]
data.sort() # 원본 data가 [1, 2, 3]으로 바뀜
print(data) # [1, 2, 3]
data = [3, 1, 2]
new_data = sorted(data) # 정렬된 새 리스트 [1, 2, 3] 반환
print(data) # 원본 유지: [3, 1, 2]
print(new_data) # 새 리스트: [1, 2, 3]
data = [1, 5, 3]
# sort() 사용 (원본 변경)
data.sort(reverse=True)
print(data) # [5, 3, 1]
# sorted() 사용 (새 리스트 반환)
new_data = sorted([1, 5, 3], reverse=True)
print(new_data) # [5, 3, 1]
nums = [-5, 2, -10, 3]
# 절대값(abs)을 기준으로 내림차순(reverse=True) 정렬
nums.sort(key=abs, reverse=True)
print(nums) # [-10, -5, 3, 2] (절대값이 10, 5, 3, 2 순서)
단순히 값의 크기가 아니라, 내가 원하는 기준(함수)을 적용해 정렬하고 싶을 때 key 매개변수를 사용합니다. key에는 함수를 전달해야 합니다.
예제 A: 길이(len) 순으로 정렬하기
문자열 리스트를 알파벳 순서가 아닌, 단어의 길이 순서대로 정렬할 때 유용합니다.
words = ['apple', 'b', 'banana']
words.sort(key=len)
print(words) # ['b', 'apple', 'banana'] (길이가 짧은 순)
# (이름, 점수) 튜플 리스트
scores = [('철수', 50), ('영희', 80), ('민수', 30)]
# 점수(x[1])를 기준으로 오름차순 정렬
sorted_scores = sorted(scores, key=lambda x: x[1])
print(sorted_scores) # [('민수', 30), ('철수', 50), ('영희', 80)]
data = [("A", 30), ("B", 10), ("C", 20)]
# 1번 인덱스(숫자)를 기준으로 정렬
data.sort(key=lambda x: x[1])
# 결과: [('B', 10), ('C', 20), ('A', 30)]
원소의 값을 그대로 쓰지 않고, 변형된 값을 기준으로 삼습니다.
길이순: len(x)
절대값: abs(x)
나머지: x % n
words = ["apple", "b", "car"]
# 길이(len) 순서대로 정렬
words.sort(key=lambda x: len(x))
# 결과: ['b', 'car', 'apple']
# (이름, 점수)
students = [("A", 50), ("B", 80), ("C", 50)]
# 1순위: 점수, 2순위: 이름
students.sort(key=lambda x: (x[1], x[0]))
# 결과: [('A', 50), ('C', 50), ('B', 80)] ('A'와 'C'는 점수가 같아 이름순 정렬됨)
여러 기준이 있을 때 하나는 오름차순, 하나는 내림차순으로 하고 싶다면 숫자에 마이너스(-)를 붙여 반대로 정렬합니다.
문자열에는 마이너스를 붙일 수 없으므로 주의하세요.
# (이름, 점수)
students = [("A", 50), ("B", 80), ("C", 50)]
# 점수는 내림차순(높은 순), 이름은 오름차순(가나다 순)
# -x[1]: 점수에 -를 붙이면 큰 수가 작아지므로 내림차순 효과가 남
students.sort(key=lambda x: (-x[1], x[0]))
# 결과: [('B', 80), ('A', 50), ('C', 50)]
users = [
{"name": "철수", "age": 20},
{"name": "영희", "age": 15},
{"name": "민수", "age": 20}
]
# 나이(age) 순으로 정렬
users.sort(key=lambda x: x["age"])
nums = [1, 2, 3, 4, 5]
# 짝수를 먼저 오게 하고 싶을 때 (나머지가 0인 것이 앞)
# x % 2 결과: 짝수(0), 홀수(1) -> 0이 1보다 작으므로 짝수가 먼저 옴
nums.sort(key=lambda x: x % 2)
# 결과: [2, 4, 1, 3, 5]
itertools.cycle과 zip 사용cycle(b)는 b 리스트를 무한히 반복하는 반복자(iterator)를 만듭니다. 이걸 zip으로 a와 묶으면, a의 길이에 맞춰서 b가 자동으로 반복되다가 a가 끝나면 멈춥니다. speedy-hand.tistory
from itertools import cycle
a = [1, 2, 3, 4, 5]
b = [1, 2, 3]
# b를 무한 반복시키고(cycle), a의 길이만큼만 짝지음(zip)
count = 0
for val_a, val_b in zip(a, cycle(b)):
if val_a == val_b:
count += 1
print(count) # 3
%) 사용 (라이브러리 없이)인덱스를 사용하여 직접 구현할 수도 있습니다. b의 인덱스를 i % len(b)로 계산하면 b의 길이를 넘어가도 다시 0부터 시작하게 됩니다. hcr3066.tistory
a = [1, 2, 3, 4, 5]
b = [1, 2, 3]
count = 0
for i in range(len(a)):
# a[i]와 b[i % len(b)]를 비교
if a[i] == b[i % len(b)]:
count += 1
print(count) # 3