[PythonBasic] For Loop

Alex of the year 2020 & 2021·2020년 6월 29일
0

Python

목록 보기
8/18
post-thumbnail

기존 문제를 for loop을 사용하여 다시 생각해보기

만일

Input으로 주어진 리스트에서 홀수 값은 전부 삭제하여
짝수 값 요소만 남겨진 리스트를 출력하는 과제

가 있다고 생각해보자
For Loop을 사용하지 않으면 이런식으로 식을 써야 한다

my_list = [int(s) for s in input().split()]

if (my_list[4] % 2) == 1:
  del my_list[4]

if (my_list[3] % 2) == 1:
  del my_list[3]

if (my_list[2] % 2) == 1:
  del my_list[2]

if (my_list[1] % 2) == 1:
  del my_list[1]
  
if (my_list[0] % 2) == 1:
  del my_list[0]
  
print(my_list)

참고로 이 때
if (my_list[0] %2) ==1:으로 먼저 시작하여
if (my)list[4] % 2) ==1:로 끝낼 수는 없다
(만일 0번 인덱스가 홀수여서 이 인덱스를 지워버리면, 그 이후의 인덱스 번호가 모두 하나씩 앞당겨져서 인덱스 번호가 계속해서 변한다!)

이 식을 for loop을 이용해서 더 짧고 간결하게 식을 작성하면 아래와 같다

my_list     = [int(s) for s in input().split()]
odd_numbers = [ ]

## 먼저 홀수값들을 골라내서 리스트를 만들고
for element in my_list:
    if (element % 2) == 1:
        odd_numbers.append(element)

## 홀수값들을 하나 하나 기존 리스트에서 지워준다
for odd_number in odd_numbers:
    my_list.remove(odd_number)

print(my_list)

이 방법이 신박했던 것은
1. 빈 리스트를 먼저 선언한 후, 그 리스트에 값을 하나씩 append를 이용하여 추가하는 것은 OK
2. 그런데 그렇게 생성된 리스트 odd_numbers 자체를 my_list 리스트에서 단번에 빼버리는 식은 생각을 못했다. 즉,
3. 더 큰 리스트에서 작은 리스트를 remove를 이용해서 삭제하는 것이 신기! my_list.remove(odd_number)


break and continue (+ iteration)

loop에서는 반복 횟수를 iteration이라고 부른다
만일 요소가 5개여서 다섯 번에 걸쳐서 반복을 돌린다? --> 5 iteration

근데 만약 이 반복을 모두 돌지 않고, 중간에 for loop을 빠져나간다면 그 때 사용하는 방법이 break 이다. 예를 들면 이런 식이다.

my_list = [1, 2, 3, 4, 5]

for element in my_list:
 if element == 3:
   print("3을 찾았습니다! 이제 그만 for 구문을 멈추겠습니다!")
   break  # 이렇게 break를 걸면, 이제 반복을 멈추고 for loop을 빠져나가게 된다.
 else:
   print("아직 3을 못찾았으니, 더 찾겠습니다.")

그런데 반복을 모두 돌긴 돌건데(for loop을 나가지는 않을 건데), 그 아래 구문들은 돌지 않고 다시 for loop의 시작점으로 돌아가고 싶을 때가 있다. 그 때 사용하는 방법은 continue이다. 예를 들면 이런 식이다.

twice = ["나연", "사나", "모모", "정연", "미나", "채영", "다현", "쯔위", "지효"]

for member in twice:
  if member != "모모":
    print("모모가 아니면 싫어요!")
    continue # 여기서 continue가 걸리면, 이제 아래 print문을 실행하기 전에 맨 위 for loop의 시작점으로 돌아간다.
    
  print("모모를 위해 선물을 보내겠습니다!")
  send_gift()

Nested For Loops

이중 포문을 이야기한다
예를 들면 이런 것


numbers1 = [1, 2, 3, 4, 5]
numbers2 = [10, 20, 30, 40, 50]

for num1 in numbers1:
    for num2 in numbers2:
        print(f"{num1} * {num2} == {num1 * num2}")


for loop을 정리하며 풀었던 문제는 아래와 같다

맨 처음 문제 분석 및 풀이 방향

  1. 우선 한 번만 나타나는 값과 그렇지 않은 값을 나누겠다면 set 개념이 쓰이지 않을까 생각했다. set은 중복을 허용하지 않는 data structure이기에, 내 생각에
  2. 기본으로 주어지는 리스트 listA - set(listA) 하면, 중복되어 등장하는 값들만 나올 것이다. 그들을 다시 listB로 리스트화 한다.
  3. 그 이후, listA에서 listB를 모두 빼버린다

이렇게 생각을 하고 문제에 접근을 했는데, set로 따로 빼 만든 data structure를 기존에 주어진 listA에서 빼는 것이 너무 어려웠다

그래서 생각을 조금 바꿔서 나온 답은 아래와 같다

my_list = [s for s in input().split()] 
list_to_print=[]

for i in my_list:
  if my_list.count(i) == 1:
    list_to_print.append(i)
    
print(list_to_print)

(한 두 시간 반 붙잡다가 결국에는) 바꾼 풀이 방향

  1. 맨 처음에 주어진 my_list에 있는 모든 요소들에 대해 for loop을 돌려,
  2. 모든 요소들이 몇 번 나오는지 세는 .count(i) 함수를 사용한다
  3. 한 번만 등장하는 요소들은 새로운 리스트에 .append(i) 함수를 사용하여 붙여준다
  4. 그리고, 그 새로운 리스트를 출력한다.

파이썬 기초 문제를 풀고 있는데, 기초가 너무 없어서 그런지 쉽지가 않다.
게다가 혼자 답을 내야하기 때문에 처음에 내가 생각해낸 그 방법(그게 어떤 방법이 되었든) 그 방법에 굉장히 집착을 하게 된다.

이 문제를 풀때는 진짜 ㅠㅠ... 생각을 바꿔 떠오른 풀이 방향이 너무 간단해서 진짜 허탈했다.

profile
Backend 개발 학습 아카이빙 블로그입니다. (현재는 작성하지 않습니다.)

0개의 댓글