본문 바로가기
Python/Python 중급

Python 파이썬 for문 중첩, enumerate(), zip(), reversed()

by 베타코드 2021. 12. 21.
반응형

안녕하세요 독학코딩입니다. 오늘은 파이썬 for문의 활용 방식에 대해서 배워보겠습니다. 이전에 기초에 대해서는 충분히 배웠고 오늘은 조금 다른 방식의 for문 표현에 대해서 배워보겠습니다.

 

for문의 기초에 대해서 모르신다면 아래 링크를 참고하시면 좋습니다. 

 

Python FOR 문

안녕하세요 독학코딩입니다. 오늘은 파이썬 for문에 대해서 배워보겠습니다. for는 ~을 위해라는 뜻으로 글자 그대로는 이해하기가 조금 어렵습니다. 일반적으로는 반복문이라고 하여 특정 행동

stcodelab.com

 

 

Python for 문 안의 중첩 for 문

실전의 경우에서 많이 사용되는 방식입니다. for문 안에 for문이 있어서 A를 3번 실행, B를 3번 실행, C를 3번 실행 이런식의 구동이 가능하게 만들어주는 방식입니다. 간단한 예제는 아래와 같습니다.

list_a = ["A", "B", "C"]
list_b = ["1번", "2번", "3번"]
for i in list_a:
    for j in list_b:
        print(i, j)

 

 

Python for 문의 enumerate()

for문에서 enumerate()for i in range(len(list_a))와 같은 기능을 제공합니다. 다만 enumerate는 따로 인자를 선언해주어야 합니다. 말이 어렵지만 아래의 예시에서 처럼 for 안에 enum처럼 인자가 한 개더 필요하다는 의미입니다.

list_a = ["코딩", "파이썬", "독학", "공부"]
for e, i in enumerate(list_a):
    print(e, i)

여기서 e 혹은 i 는 모두 임의 명명입니다. 원하시는 철자로 작성하시면 됩니다. 몇몇 예외는 있지만 그건 해보시면서 배우시길 바랍니다.  보통은 i와 j를 많이 사용합니다.

근데 for i in range(len(list_a))와 같은 기능인데 왜 굳이 enumerate()을 사용 하는 걸까요? 그건 enum의 시작 값을 설정할 수 있기 때문입니다.

list_a = ["코딩", "파이썬", "독학", "공부"]
for e, i in enumerate(list_a, 11):
    print(e, i)

위의 (list_a, 11) 처럼 11같이 시작 값을 설정할 수 있습니다. 딱히 이런 경우가 아니라면 전 주로 for i in range(len(list_a))를 사용합니다.

 

 

Python for 문의 복수 리스트, zip()

다음은 복수의 리스트로 for문을 사용하는 방법입니다.

list_a = ["코딩", "파이썬", "독학", "공부"]
list_b = ["공부", "좋아", "코딩", "하자"]
for i, j in zip(list_a, list_b):
    print(i, j)

얼핏 보기엔 list가 두 개이니깐 처음 소개한 중첩 for문과 같아 보이겠지만 그렇지 않습니다. 출력해보시면 아시겠지만, zip(list_a, list_b)의 경우는 동시에 실행되는 것입니다. enumerate()와 더 비슷하다고 생각해주시면 됩니다. list_a, list_b 두 리스트의 길이가 달라도 상관없으며 최소 길이의 리스트만큼 실행됩니다.

마지막 말이 제일 중요합니다. 두 리스트이 길이가 달라도 오류가 나지 않습니다.
보통 위와 같은 기능을 구현할 때 아래와 같이 합니다.

for i in range(len(list_a)):
    print(list_a[i], list_b[i])

하지만 이 경우는 list_blist_a보다 길이가 긴 것은 상관없지만, list_a가 더 길다면 IndexError: list index out of range가 발생합니다. 즉, 정말 확실하게 list_b가 더 길거나 서로 같다고 확신 할 수 없는 상황이라면 zip()을 사용하는게 좋습니다. 실전에선 보통 list의 길이를 미리 확인하거나 제한해서 사용하기 때문에 둘 중 뭐를 쓰셔도 솔직히 상관은 없습니다.

 

 

Python for 문의 **enumerate(), zip() 혼합

list_a = ["코딩", "파이썬", "독학", "공부"]
list_b = ["공부", "좋아", "코딩", "하자"]
for z, (i, j) in enumerate(zip(list_a, list_b), 11):
    print(z, i, j)

enumerate()zip()를 혼합하여 사용하는 방식입니다. 두 개의 리스트와 z라는 index까지 만들 수 있는 방법입니다.

for i in range(len(list_a)):
    print(i, list_a[i], list_b[i])

저는 이 방식을 선호하지만 위에서 말씀드린 거처럼 IndexError: list index out of range의 위험성은 있습니다.

 

 

Python for 문의 역 리스트, reversed()

실전에서 정말 많이 사용된다고 생각되는 rereversed()입니다. 정확히는 reversed()를 사용하는 건 아니지만 리스트를 역으로 사용해야 되는 경우가 많이 있기 때문에 리스트를 반전하는 방법은 알아두시면 좋습니다.

for element in reversed(list_a):
    print(element)

일반적으로는 이렇게 많이 합니다. rereversed() 의미 그대로 반전하여 리스트를 반복할 수 있습니다.

for element in list_a[::-1]:
    print(element)

이렇게 list_a뒤에 [::-1]를 붙여서 리스트를 반전하는 방식도 있습니다. 참고하면 좋습니다.

 

 

Python for 문 한 줄 표현식

이 부분은 활용이라기보다는 제가 파이썬 초보일 때 모르는걸 구글링 하다 보면 고수 분들이 한 줄로 적어둔 for문을 많이 봤었는데 전혀 이해를 못 했어서 시간을 버린 적이 많아서 참고 삼아 알려드리겠습니다.

새로운 리스트를 만들거나 if 조건 식으로 기존 리스트를 선별하여 새 리스트를 만들 때 아래와 같이 많이 하실 겁니다.

list_a = [1, 2, 3, 4, 5]
list_b = []
for element in list_a:
    if element > 2:
        list_b.append(element)
print(list_b)

상당히 길고 복잡하죠? 이걸 한 줄로 표현하는 게 가능합니다. 한 줄 표현은 짧지만 복잡합니다. 이해만 하신다면 정말 유용하실 겁니다.

list_b = [element for element in list_a if element > 2]

위에 길게 쓴 코드와 비교하면서 이해해보시면 될 것 같습니다. 한 줄 표현식에 대해선 다음에 더 자세히 배워보겠습니다.

반응형

댓글