Q. Input으로 주어진 리스트에서 홀수는 전부 지우고 짝수만 남은 리스트를 리턴해주세요.
리스트의 요소들은 전부 숫자값이고 총 요소 수는 5개 입니다.
example input = [1, 2, 3, 4, 5] #결과 [2, 4]
list
내 elements
수가 표기되어 있을 때, if
문만을 이용하여 풀어보는 방식이다.
일단 elements 들을 지우는 .remove()
와 del
의 차이를 이해하여야 하고, 이를 적절하게 이용할 줄 알아야 풀 수 있는 문제였다.
처음 접했을 땐 .remove()
가 더 친숙하였기에 이를 이용하여 간단히 아래와 같이 짜면 될 줄 알았다.
example = [1, 2, 3, 4, 5]
def remove_odd_numbers(numbers):
if numbers[0] % 2 != 0:
return numbers.remove()
if numbers[1] % 2 != 0:
return numbers.remove()
if numbers[2] % 2 != 0:
return numbers.remove()
if numbers[3] % 2 != 0:
return numbers.remove()
if numbers[4] % 2 != 0:
return numbers.remove()
return numbers
print(remove_odd_numbers(example))
# Output
TypeError: list.remove() takes exactly one argument (0 given)
TypeError
가 뜨길래 한참 고민하다가, 나의 허접한 코딩 실력에 눈물을 흘리지 않을 수 없었다.
내가 조건문을 시작하기 전에 parameter
를 지정 안했으니, .remove()
method를 사용했을 때 뭐를 지워야 하는지 프로그램은 이해를 하지 못했을 것이다.
(return
을 하라는데 뭘 return
하라는지 지정을 안해줬으니..)
그러가 del
키워드가 생각이 났다.
return
키워드를 삭제하고 del
키워드로 다시 짜보면,
example = [1, 2, 3, 4, 5]
def remove_odd_numbers(numbers):
if numbers[0] % 2 != 0:
del numbers[0]
if numbers[1] % 2 != 0:
del numbers[1]
if numbers[2] % 2 != 0:
del numbers[2]
if numbers[3] % 2 != 0:
del numbers[3]
if numbers[4] % 2 != 0:
del numbers[4]
return numbers
print(remove_odd_numbers(example))
# Output
IndexError: list index out of range
엥 이번엔 IndexError
가 떴다.
list
가 범위에서 벗어났단다.
찾아보니 del
키워드를 사용해서 element
가 지워지면, 파이썬은 list의 index 들을 자동으로 정렬시켜 준다고 한다.
즉 del
을 사용해서 element가 지워지면 뒤에서 한칸씩 땡겨진다는 개념이다.
그럼 이거를 한번 거꾸로 해보면.. logic이 반대로 되어서 내가 만든게 통하지 않을까? 싶었다.
어차피 elemtns 개수는 정해져있으니 말이다.
example = [1, 2, 3, 4, 5]
def remove_odd_numbers(numbers):
if numbers[4] % 2 != 0:
del numbers[4]
if numbers[3] % 2 != 0:
del numbers[3]
if numbers[2] % 2 != 0:
del numbers[2]
if numbers[1] % 2 != 0:
del numbers[1]
if numbers[0] % 2 != 0:
del numbers[0]
return numbers
print(remove_odd_numbers(example))
# Output:
[2, 4]
"깨달아버렸다 ㅋㅋ"
- 나 -
혹시나 해서 다른 숫자로 바꿔봤는데도 잘 됐다.
del
키워드의 이해이번 고군분투를 통해서 확실히 list 내 elements 들을 편집할 때 del
키워드를 어떻게 사용해야 하는지 이해한 것 같다.
나중에 시간을 내서 이번에 못했던, .remove()
method를 이용한 방법도 한번 시도해봐야 겠다..