타 언어의 경우는 임시 변수(temp)를 사용해서 값을 바꾸는데, Python 은 매우 편리한 기능을 가지고 있다.
a = 3
b = 7
a,b = b,a # 이렇게만 써도 SWAP이 되다니
이제 리스트(배열) 내 원소 값을 바꾸고 싶을 때를 살펴보자.
Python 에서는 객체에 대한 참조로 구현되어 있기 때문에 주소 값이 저장되어있다.
반면 C 언어는 배열 안에 실제 원소 값이 저장되어 있다.
void SWAP(int* a, int* b) { // Parameter Type : Pointer
temp = a;
a = b;
b = temp;
}
int main(void) {
int arr[2];
arr[0] = 100; arr[1] = 200;
SWAP(&arr[0], &arr[1]); // Argument Type : Address
}
따라서 C 언어 배열 내 원소 값을 바꾸고 싶다면 주소 값(Address)을 전달인자(Argument)로 넘겨,
SWAP 함수에서 포인터(Pointer)로 매개변수(Parameter)를 받아야 해서 번거로웠다.
하지만 파이썬 리스트는 엄청 간단했다.
list = [1, 2]
list[0], list[1] = list[1], list[0]
줄곧 C 언어만 사용해 왔던 나는, 매우 충격이었다… 🥺
대체로 더블 포인터를 사용할 것이라고 생각된다.
하지만 Python 은 이미 준비된 다양한 방법들이 존재한다.
1. (리스트의 경우) reverse
str = “hello”
str_list = list(str) # [‘h’, ‘e’, ‘l’, ‘l’, ‘o’]
str_list.reverse() # [‘o’, ‘l’, ‘l’, ‘e’, ‘h’]
print(‘’.join(str_list))
# 문자열로 출력하고 싶을 시, 분리된 원소를 다시 join 하는 것까지 필요
2. (문자열의 경우) reversed
str = “hello”
reversed(str) # <reversed object at 0xf769>
print(‘’.join(reversed(str)))
# reversed 객체를 반환하기 때문에, join 함수로 다시 문자열로 바꿔주자
3. (문자열의 경우) Slicing
str = “hello”
print(str[::-1]) # olleh
print(str[::-2]) # olh
필자가 자주 쓰던 C 언어와는 차원이 다른 문자열 활용성을 보여준다.
괜히 코딩 테스트에서 많이 사용하는 언어가 아니다… 🤓
함수 이름 | True 반환 | False 반환 |
---|---|---|
isdigit( ) | 숫자 | 숫자 외 혹은 공백 및 기호 |
isalpha( ) | 알파벳(혹은 한글) | 알파벳(한글) 외 혹은 공백 및 기호 |
isalnum( ) | 숫자 + 알파벳(혹은 한글) | 숫자 + 알파벳(한글) 외 혹은 공백 및 기호 |
그렇다면 다음 코드의 결과는 어떻게 될까?
str = “Hello World”
print(str.isalpha()) # False
phone_num = “010-1212-3939”
print(phone_num.isdigit()) # False
공백 및 기호는 위 함수들이 False를 반환한다는 사실! 🧐
리스트를 정렬하고 싶다면 두 가지 방법이 존재한다.
1. sort
A1 = [7, 8, 5, 1, 2]
print(A1) # [7, 8, 5, 1, 2]
A2 = A1.sort()
print(A1) # [1, 2, 5, 7, 8] (원본 변경)
print(A2) # 존재하지 않음
2. sorted
A1 = [7, 8, 5, 1, 2]
print(A1) # [7, 8, 5, 1, 2]
A2 = sorted(A1)
print(A1) # [7, 8, 5, 1, 2] (원본 유지)
print(A2) # [1, 2, 5, 7, 8] (정렬된 값을 반환)
두 함수의 차이가 보이는가?
sort 함수는 원본 상태의 리스트를 정렬된 상태로 변경하는 것이고,
sorted 함수는 정렬된 리스트를 생성하여 반환하는 것이다.
위에 #344. Reverse Sting 문제에서 살펴본 reverse와 reversed 함수도 똑같은 원리가 적용된다!
## 1. reverse
A = [1, 3, 5, 7, 9]
A.reverse() # [9, 7, 5, 3, 1]
## 2. reversed
A = [1, 3, 5, 7, 9]
list(reversed(A)) # [9, 7, 5, 3, 1]
reverse 함수는 원본 상태의 리스트를 거꾸로 뒤집고,
reversed 함수는 거꾸로 뒤집은 상태를 반환 해주기는 하지만 리스트 자체를 반환해주는 것이 아니고,
객체를 반환하기 때문에 (문자열의 경우 join 함수를 사용) 리스트의 경우 리스트의 형태로 다시 한 번 더 변형이 필요하다. 😟
예시로, “let2 own kit dig” 라는 문자열을 가지고 놀아보자!
1. 문자열 나누기 : split
str = “let2 kit own dog”
str.split() # [‘let2’, ‘kit’, ‘own’, ‘dog’]
str2 = “let2_kit_own_dog”
str2.split(‘_’) # [‘let2’, ‘kit’, ‘own’, ‘dog’]
split( ) 함수 내에 아무 값도 삽입하지 않으면, 공백을 기준으로 나누어진다.
2. 문자열 자르기 : slicing
str.split()[1:] # [‘kit’, ‘own’, ‘dog’]
str2.split()[::-1] # [‘dog’, ‘own’, ‘kit’]
split( ) 함수를 통해서 나누어진 값은 리스트에 저장되기 때문에, 이를 슬라이싱 할 수 있다.
3. 문자열 삽입하기 : join
‘’.join(str.split()[1:]) # “kit own dog”
str3 = “abcde”
‘,’.join(str3) # a,b,c,d,e
문자열 각각의 문자 사이 혹은 리스트 내 원소들 사이에 특정 값을 삽입하는데,
아무 값도 넣지 않는다면 합치는 것과 다름없지 않은가! 😜