배열 앞 뒤의 차
배열을 인자로 받아서 배열 앞 뒤의 차로 새롭게 만들어진 배열을 반환하시오. 배열의 마지막 인자는 차를 구할 수 없기 때문에 이 값은 구하지 않는다.
INPUT
[83, 48, 13, 4, 71, 11]OUTPUT
[35, 35, 9, 67, 60]def solution(mylist):
answer = []
for index, number in enumerate(mylist):
if index + 1 == len(mylist):
continue
else:
answer.append(abs(number - mylist[index + 1]))
return answer위의 코드처럼 문제를 풀 수 있다. 여기서 잠깐 enumerate()라는 요상한(?) 메소드가 나타났다. 이것을 알기 위해서 파이썬에서 사용하는 반복문에 대해서 알아보도록 하자. 파이썬에서는 자바스크립트(일반적인 for, for in, for of forEach) 와는 다르게 한가지 방법으로만 for문을 사용할 수 있다. syntax는 아래와 같다.
for item in iterable:
반복할 코드
여기서 주의깊게 볼 부분은 iterable 객체를 사용한다는 점이다. 어떤 iterable 객체를 사용하냐에 따라서 파이썬에서의 for문이 다양한 것처럼 보여지기도 한다. 일반적으로 우리가 자주 접하는 리스트, 딕셔너리, 셋(set, 집합), 문자열, 튜플 등이 iterable 객체로서 for문에서 사용하는데 거부감이 없습니다. 여기에 파이썬의 for문에서만(?) 보이는 2가지 경우가 더 있습니다. range()와 enumerate() 입니다.
range()는 range(start, stop, step)의 형태로 사용한다. start의 기본값은 0, step의 기본값은 1, stop 만이 필수값이다. (리스트의 슬라이싱과 유사하다.) range()는 start부터 stop-1까지 step만큼씩 나열되는 숫자를 생성한다. for문에서 사용될 때는 보통 몇 번 반복하겠다는 의도로서 사용 할 수 있다. 아래의 코드를 처럼 사용하면 10번 반복하겠다 라는 의미가 된다.
for i in range(10):
print(i) # 0 1 2 3 4 5 6 7 8 9그렇다면 리스트의 인덱스로서 접근하여 반복문을 돌리고 싶다면 어떻게 해야 할까?
coins = ['Bitcoin', 'Ethereum', 'Chiliz', 'Ton', 'BitTorrent']
for i in range(len(coins)): # 0 1 2 3 4
print(coins[i])이런 식으로 코드를 작성하게 되면, 우리가 일반적으로 사용하는 방식처럼 인덱스를 이용하여 사용할 수 있다. 하지만 이는 파이썬에서 지향하는 코드 스타일이 아니다. 즉 pythonic하지 않기 때문에 비추한다. 반복문에서 인덱스를 사용하고 싶다라고 한다면 이 때 사용될 수 있는 방법이 enumerate 이다.
enumerate()는 인자로서 iterable 객체가 들어간다. 그렇게 되면 iterable 객체의 각 요소와 인덱스가 담긴 튜플을 만들어준다. 만약에 각각의 인덱스와 요소에 접근하고 싶다면 언팩킹하여 적어주면 된다.
exchanges = ['binance','upbit', 'bithumb', 'coinbase', 'huobi']
for item in enumerate(exchanges):
print(item)
# (0, 'binance') (1, 'upbit') (2, 'bithumb') (3, 'coinbase') (4, 'huobi')
for index, name in enumerate(exchanges):
print(index, name)
# 0 binance, 1 upbit, 2 bithumb, 3 coinbase, 4 huobidef solution(mylist):
answer = []
for number, afterNumber in zip(mylist, mylist[1:]):
answer.append(abs(number - afterNumber))
return answer앞에서 배운 zip()의 연장선에 있다. zip()을 이용하면 인덱스를 통해서 문제를 접근할 필요가 없다. 앞에서 설명했듯이 zip()은 동일한 자료형을 순서대로 묶어준다. 단, 길이가 짧은 자료형을 기준으로 묶어진다. 즉 위의 코드는 슬라이싱한 배열인 mylist[1:]을 기준으로 해당 배열보다 1개 작은 길이의 튜플이 만들어진다. 예를 통해서 보자.
array1 = [ 1, 2, 3, 4, 5 ]
array2 = [ 10, 20, 30, 40 ]
zip(array1, array2)
# (1, 10) (2, 20) (3, 30) (4, 40)5에는 접근하지 않는다. 또한 위에서 나온 결과값처럼 반복문을 돌기 때문에 array1과 array2의 값에 순서대로 접근할 수 있다.