이번 글에는 파이썬 알고리즘이나 개념이 아닌 알면 좋은 코드들에 대해 말하겠습니다.
1. split & join
2. list comprehension
3. enumerate & zip
4. lambda & map & reduce
5. asterisk (가변인자)
1. spilt & join
split은 string type값을 "기준값"으로 나눠서 List 형태로 변환하는 코드입니다.
1
2
3
|
string = 'a b c d e'
string_list = string.split(' ')
print(string_list)
|
cs |
이렇게 공백 또는 string_list = string.split(',') 등의 코드로 기준 값으로 문자열을 리스트 형태로 변환합니다.
join함수는 string으로 구성된 리스트를 합쳐서 하나의 string으로 만드는 역할을 합니다.
split함수의 역기능으로 생각하시면 편합니다.
1
2
|
string = '-'.join(string_list)
print(string)
|
cs |
이렇게 되면 문자들이 -을 사이로 하나의 string으로 결합이 됩니다.
2. list comprehension
간단히 설명하면 기존 우리가 for append를 이용해서 리스트 만드는 것을 단축시킬 수 있는 간단 for문입니다.
1
2
3
4
5
6
|
result_list = []
for i in range(10):
result_list.append(i)
fast_result = [i for i in range(10)]
print(result_list,fast_result)
|
cs |
위의 for반복문은 우리가 리스트를 만들때 보통 사용하는 방법입니다.
하지만 시간 단축을 위해 밑의 방법을 사용하는걸 추천합니다. 결과값은 동일합니다.
1
2
3
4
|
case_1 = ["a","b","c"]
case_2 = ["d","e","a"]
result_list = [i + j for i in case_1 for j in case_2 if not i == j]
print(result_list)
|
cs |
이렇게 if문과 함께 사용하는것도 가능합니다.
3. enumerate & zip
enumerate는 list의 원소를 추출할 때 번호를 붙여서 추출하는 코드입니다.
1
2
3
|
list_a = ["a","b","c","d","e"]
list_b = list(enumerate(list_a))
print(list_b)
|
cs |
이렇게 볼수 있듯이 리스트의 원소들에 번호를 붙여서 추출이 됩니다.
zip은 두 개의 list의 값을 병렬적으로 추출하는 코드입니다.
1
2
3
4
5
|
alist = ['a1','a2','a3']
blist = ['b1','b2','b3']
a,b,c = zip(alist,blist)
print(a,b,c)
|
cs |
이렇게 볼수 있듯이 alist의 첫 번째 원소와 blist의 첫 번째 원소가 하나의 튜플로 합쳐진 모습으로 볼 수 있습니다.
4. lambda & map % reduce
lambda함수는 함수 이름 없이 함수처럼 사용할 수 있는 익명함수입니다.
1
|
print((lambda x: x + 2)(5))
|
cs |
이와 같이 함수를 사용해서 처리해야 하는 코드를 한 줄로 처리할 수 있습니다.
map함수는 두 개이상의 리스트에도 적용 가능합니다. IF 필터도 사용 가능합니다.
1
2
3
|
a = [1, 2, 3, 4, 5]
b = [2, 4, 6, 8, 10]
print(list(map(lambda x, y: x * y, a, b)))
|
cs |
이렇게 map함수를 이용하면 두 개의 리스트를 이용할 수 있다.
reduce함수는 리스트에 저장된 요소를 순서대로 더한 다음 누적된 결과를 반환합니다.
1
2
|
from functools import reduce
print(reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]))
|
cs |
reduce함수는 functools에서 reduce를 가져와야 한다.
출력값은 1,2,3,4,5를 다 더한 15이다.
5. asterisk
*을 보면 C언어의 포인터가 생각난다. 그래서 별로 좋은 기억이 있다..
하지만 파이썬의 *(asterisk)기호는 사용하면 편리한 기능이다.
tuple, dict 등 자료형에 들어가 있는 값을 unpacking 하는 기능이다.
1
2
3
4
|
def asterisk_test_2(*args):
x, y, z = args
return x, y, z
print(asterisk_test_2(3, 4, 5))
|
cs |
위의 코드는 *기호가 없다면 런타임 에러가 생기는 코드다.
asterisk_test_2 함수의 매개변수는 하나인데 함수의 인자가 3개이기 때문이다. 그래서 실제로 *을 제거한 뒤 실행시키면
이렇게 1개의 인자만 받을 수 있는데 3개가 주어졌다고 나온다.
하지만 * 기호를 사용하면 3개의 인자를 한 번에 받을 수 있다.
인자를 튜플 타입으로 받은 모습을 확인할 수 있다.
1
2
3
|
def asterisk_test(a, b, *args):
return a+b+sum(args)
print(asterisk_test(1, 2, 3, 4, 5))
|
cs |
a와 b를 받은 뒤 남은 인자들을 튜플 형태로 받은 모습이다.
*기호를 두 번 사용하면 딕셔너리 타입의 값들을 받을 수 있다.
1
2
3
4
|
def asterisk_test(**data):
print(data)
data = {"b":1 , "c":2, "d":3}
asterisk_test(**data)
|
cs |