만일
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)
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()
이중 포문을 이야기한다
예를 들면 이런 것
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을 정리하며 풀었던 문제는 아래와 같다
맨 처음 문제 분석 및 풀이 방향
- 우선 한 번만 나타나는 값과 그렇지 않은 값을 나누겠다면 set 개념이 쓰이지 않을까 생각했다. set은 중복을 허용하지 않는 data structure이기에, 내 생각에
- 기본으로 주어지는 리스트 listA - set(listA) 하면, 중복되어 등장하는 값들만 나올 것이다. 그들을 다시 listB로 리스트화 한다.
- 그 이후, 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)
(한 두 시간 반 붙잡다가 결국에는) 바꾼 풀이 방향
- 맨 처음에 주어진 my_list에 있는 모든 요소들에 대해 for loop을 돌려,
- 모든 요소들이 몇 번 나오는지 세는 .count(i) 함수를 사용한다
- 한 번만 등장하는 요소들은 새로운 리스트에 .append(i) 함수를 사용하여 붙여준다
- 그리고, 그 새로운 리스트를 출력한다.
파이썬 기초 문제를 풀고 있는데, 기초가 너무 없어서 그런지 쉽지가 않다.
게다가 혼자 답을 내야하기 때문에 처음에 내가 생각해낸 그 방법(그게 어떤 방법이 되었든) 그 방법에 굉장히 집착을 하게 된다.
이 문제를 풀때는 진짜 ㅠㅠ... 생각을 바꿔 떠오른 풀이 방향이 너무 간단해서 진짜 허탈했다.