이번에는 지금까지 배운 정수형, 문자열, 리스트, 사전 등 다양한 데이터 타입 중에서 알아둬야 할 특징에 대해서 다뤄보고자 한다.
- 가명 (Aliasing)
# 변수에서 가명(Aliasing)이 작동하는 방식
x = 5
y = x
y = 3
print(x) # 5
print(y) # 3
# 리스트에서 가명이 작동하는 방식
x = [3, 2, 6, 1]
y = x
y[0] = 9
print(x) # '9', '2', '6', '1'
print(y) # '9', '2', '6', '1'
# 리스트를 가명이 아닌 새로운 변수에 입력하고 싶을 때
x = [1, 4, 6, 7]
y = list(x)
y[2] = 5
print(x) # '1', '4', '6', '7'
print(y) # '1', '4', '5', '7'
첫 번째부터 살펴보면, 기본적인 정수형에 변수(x)를 할당해 사용할 때 다른 변수(y)에 기존 변수(x)를 대입하고 y에 다른 값을 입력하면, 숫자 5라는 값에 붙었던 변수 x와 y가 각각 5, 3으로 따로 작용하는 것을 확인할 수 있다.
하지만, 리스트 변수에 x를 할당하고 y에 x를 대입하면 같은 리스트에 변수 x와 y가 꼬리말처럼 붙어서 어느 변수를 호출해도 같은 동작을 한다. 이 경우에는 리스트[3, 2, 6, 1] x라는 변수 이름 외에도 가명(alias)인 y가 할당되는 것이다.
따라서, x와 y가 리스트를 가진 변수지만 따로 사용하려면 y에 직접적으로 변수 x를 대입하는 것이 아니라, x의 데이터만 가지고 복사를 해줘야 한다. 위 예시는 리스트였기 때문에 list(x)라고 입력해 x에 입력된 데이터를 리스트 형으로 받아 넣어줬다.
한 가지 데이터에 가명이 붙어 어떤 변수를 호출해도 같은 데이터로 도달한다는 것을 유의하여 코드를 작성해야 한다.
- 리스트와 문자열의 공통/차이점
# 리스트와 문자열의 공통점
# 인덱싱
list_ex = ['ㄱ', 'ㄴ', 'ㄷ', 'ㄹ', 'ㅁ', 'ㅂ']
str_ex = 'ㄱㄴㄷㄹㅁㅂ'
print(list_ex[1]) # ㄴ
print(list_ex[3]) # ㄹ
print(list_ex[-2]) # ㅁ
print(str_ex[1]) # ㄴ
print(str_ex[3]) # ㄹ
print(str_ex[-2]) # ㅁ
# for 반복문 (인덱싱이 되니 for 반복문이 사용가능함)
for letter in list_ex:
print(letter)
for korean in str_ex:
print(korean)
# 슬라이싱
print(list_ex[0:4]) # ['ㄱ', 'ㄴ', 'ㄷ', 'ㄹ']
print(str_ex[0:4]) # ㄱㄴㄷㄹ
# 덧셈 연산
list_ex1 = ['A', 'B', 'C', 'D']
list_ex2 = ['E', 'F', 'G']
list_ex3 = list_ex1 + list_ex2
print(list_ex3) # ['A', 'B', 'C', 'D', 'E', 'F', 'G']
str_ex1 = 'ABCD'
str_ex2 = 'EFG'
str_ex3 = str_ex1 + str_ex2
print(str_ex3) # ABCDEFG
문자열과 리스트는 서로 비슷하게 인덱싱, for 반복문, 슬라이싱, 덧셈 연산에 사용될 수 있다. 특정 경우에 출력 값이 다르지만, 결국 사용하는 방식이 비슷하다는 것이다.
하지만, 차이점으로는 리스트는 여러 개의 값 중에 특정 값을 수정할 수 있는(mutable) 반면에, 문자열은 중간에 문자를 지정해서 수정할 수 없다.
따라서, 문자열을 수정하기 위해서는 리스트로 전환한 후 작업해서 다시 문자열로 돌아오는 방법을 사용할 수 있다는 것을 생각해야 한다.
- 실습
# 1부터 1000까지 각 숫자의 자리수의 합을 함수를 생성해 구해보자
# 자리수 합 리턴
def sum_digit(num):
total = 0 # 모든 자리수가 축적되는 변수
str_num = str(num)
for cell in str_num:
total += int(cell)
return total
# sum_digit(1)부터 sum_digit(1000)까지의 합 구하기
hap = 0 # 자리수 합이 축적되는 변수
for i in range(1, 1001):
hap += sum_digit(i)
print(hap)
어려운 것 없이 숫자를 문자열로 구분하여 각 자리 숫자를 for 반복문으로 축적하는 방식으로 문제를 풀었다.
# 주민등록번호 뒤 네자리를 마스킹하는 법
def mask_security_number(security_number):
ssn = list(security_number) # 값 수정을 위해 문자열을 리스트로 변환
ssn[-4:] = ['*', '*', '*', '*']
return ''.join(ssn) # 리스트를 다시 문자열로 변환
# 테스트 코드
print(mask_security_number("880720-1234567"))
print(mask_security_number("8807201234567"))
print(mask_security_number("930124-7654321"))
print(mask_security_number("9301247654321"))
print(mask_security_number("761214-2357111"))
print(mask_security_number("7612142357111"))
# 접근법 2
def mask_security_number(security_number):
return security_number[:-4] + '****'
주민번호를 받아서 수정하기 위해 리스트로 변경하고, 마스킹 처리를 한 다음, 다시 문자열로 돌리는 과정에서 리스트 출력 형태 그대로 문자열로 바뀐다는 것을 알아서 헤맸다.
리스트를 문자열로 변환할 때에는 join 함수를 사용하면 다시 문자열 형태로 합쳐서 보기 좋게 할 수 있으며, join 앞에 ''는 구분자로 어떤 것을 넣을지 정하는 것이다. 출력 값에서 문자들 사이에 구분자가 따로 없어야 되기 때문에 아무런 값도 넣지 않았다.
위 실습의 경우에는 마지막 뒷자리 네 자리, 즉 앞/뒤 특정 구간만 바꿔주면 되기 때문에 슬라이싱과 덧셈연산을 통해 아주 간단하게 해결할 수 있는 방법도 있었다.
# 팰린드롬 판별기: 거꾸로 읽어도 똑같은 단어
def is_palindrome(word):
reversed_word = list(word)
for letter in range(len(reversed_word) // 2): # 단어 뒤집기
reversed_word[letter], reversed_word[len(reversed_word) - letter - 1] = reversed_word[len(reversed_word) - letter - 1], reversed_word[letter]
if word == ''.join(reversed_word): # 팰린드롬 판별
return True
else:
return False
# 테스트 코드
print(is_palindrome("racecar"))
print(is_palindrome("stars"))
print(is_palindrome("토마토"))
print(is_palindrome("kayak"))
print(is_palindrome("hello"))
# 모범 답안
def is_palindrome(word):
for left in range(len(word) // 2):
right = len(word) - left - 1
# 대칭을 이루는 글자가 일치하지 않을 경우 False 반환
if word[left] != word[right]:
return False
# for문에서 아무런 값 없이 나왔다면 모든 쌍이 일치
return True
위 실습에서는 처음 풀이를 할 때, 단어를 뒤집고 기존 단어와 대조하는 판별식을 만드려고 해서 코드가 많이 길고 복잡해졌다. 단어를 뒤집는 과정과 대조하는 과정을 합치면 훨씬 간결한 코드가 나왔기 때문에 모범 답안을 따로 작성해 보았다.
'IT Self-study > Python' 카테고리의 다른 글
| 랜덤 숫자 맞추기 프로그램 (0) | 2025.04.11 |
|---|---|
| 파이썬 기초: 모듈 (0) | 2025.04.11 |
| 파이썬 기초: 사전 (0) | 2025.04.05 |
| 파이썬 기초: for 반복문 (0) | 2025.04.04 |
| 파이썬 실습 (2): 리스트 (0) | 2025.04.04 |