Python/Study

python 기초 - 한줄 수식 정리 (for, if 등) + zip, *zip

pybi 2023. 1. 15. 15:13

이전 편에서 if, for 등에 대해서 언급하면서 한줄 수식에 대해서 잠깐 언급했었다.

2022.12.08 - [Python/Study] - python(study) - class (부모, 자식 class, init, super)

 

 

이번에는 조금 더 자세히 알아보자.

우선 한번 설명했었던 한줄 for 문이다. 아래처럼 기존 list의 값을 원하는대로 바꿔서 새로운 list를 만들 수 있다.

one = [1,2,3]
print(one)
one_for = [i + 10 for i in one]
print(one_for)
[1, 2, 3]
[11, 12, 13]

 

 

다음은 if 문을 한줄로 만들어보자. if 구문이 들어가고 조건에 맞으면 ( : ) 이후 내용을 수행한다.

if 5 > 1 :
    print("YES")
if 5 > 6 :
    print("YES")   
if 5 > 1 : print("YES")
if 5 > 6 : print("YES")
YES
YES

 

 

이번에는 if ~ else 문을 한줄로 만들어보고 기존 if ~ else와 비교해보자. 뭔가 더 간단해진 것 같기도 하고..

if 5 > 1 :
    print("YES")
else :
    print("NO")

if 5 > 6 :
    print("YES")
else :
    print("NO")

print("YES") if 5 > 1 else print("NO")
print("YES") if 5 > 6 else print("NO")
YES
NO
YES
NO

 

 

그렇다면 if ~ elif ~ else 구문은 어떻게 될까? 한번 만들어보자. 아래처럼 변경이 가능하다. elif 가 아니라 else를 한번 더 넣어야 한다.

a = 3
if a == 1 :
    print("IF")
elif a == 3 :
    print("ELIF")
else :
    print("ELSE")

print("IF") if a == 1 else print("ELIF") if a == 3 else print("ELSE")
ELIF
ELIF

 

 

한줄구문을 조금 더 보기 위해 아래 내용을 확인해보자. a 값에 따른 pirnt 결과를 보면 어떻게 매칭이 되는지 조금 더 쉽게 확인할 수 있다.

a = 1
print("IF") if a == 1 else print("ELIF") if a == 3 else print("ELSE")
a = 3
print("IF") if a == 1 else print("ELIF") if a == 3 else print("ELSE")
a = 5
print("IF") if a == 1 else print("ELIF") if a == 3 else print("ELSE")
IF
ELIF
ELSE

 

 

그럼 마지막으로 zip과 *zip에 대해서 알아보고 이또한 한줄함수로 확인해보자.

zip은 말그대로 여러개의 list를 합쳐준다. 아래를 결과값을 보면 확실히 파악이 가능하다.

list1 = [1,2,3]
list2 = ["a","b","c"]
list3 = ["가", "나", "다"]

list_sum = zip(list1,list2,list3)
print(list(list_sum))
[(1, 'a', '가'), (2, 'b', '나'), (3, 'c', '다')]

 

 

 

 

 

그렇다면 unzip은 어떻게 할까? 아래처럼 zip 안쪽에 변수를 입력할 때 *를 붙이면 된다.

list_sum = [(1, 'a', '가'), (2, 'b', '나'), (3, 'c', '다')]
list1, list2, list3 = zip(*list_sum)
print(list1)
print(list2)
print(list3)
(1, 2, 3)
('a', 'b', 'c')
('가', '나', '다')

 

 

어라.. 결과값이 ()로 되어 있는걸 보니 type이 tuple인가보네.. 필요에 따라 list로 변경해주면 된다.

list_sum = [(1, 'a', '가'), (2, 'b', '나'), (3, 'c', '다')]
list1, list2, list3 = zip(*list_sum)
print(list(list1))
print(list(list2))
print(list(list3))
[1, 2, 3]
['a', 'b', 'c']
['가', '나', '다']

 

 

마지막은 zip도 한줄함수로 변경해보자! 이전에 설명한 for랑 똑같다. (간단하다.)

list1 = [1,2,3]
list2 = ["a","b","c"]

for x, y in zip(list1,list2):
    print(f'{x} / {y}')

zip_list = [print(f'{x} / {y}') for x, y in zip(list1,list2)]
1 / a
2 / b
3 / c
1 / a
2 / b
3 / c

 

 

아니면 이런식으로 특정 부분만 변수에 바로 담을수도 있다.

list1 = [1,2,3]
list2 = ["a","b","c"]

zip_list = [[x+2,y] for x, y in zip(list1,list2)]
print(zip_list)
[[3, 'a'], [4, 'b'], [5, 'c']]

 

한가지 내용을 더 추가하고자 한다. 변수에 담을 때 특정 조건을 만족하는 값들만 담는 경우이다. (제일 마지막에 if x < 2를 추가했다.) 해당 내용도 많이 쓰이므로 참고해두면 좋다.

list1 = [1,2,3]
list2 = ["a","b","c"]

zip_list = [[x+2,y] for x, y in zip(list1,list2) if x < 2]
print(zip_list)

 

 

궁금하신 점은 언제나 댓글 달아주세요.