본문 바로가기

Programming/Python Tutorials

[PYTHON 3] Tutorials 35. Unpack List or Tuples ( 리스트, 튜플 풀기)


이번 시간에는 파이썬에서 리스트, 튜플을 다룰때 언패킹(풀기)을 어떻게 주로 이용하는지를 알아보고자 합니다. 일상 생활에서 우리가 마트에 장을 보러 간다고 가정을 해 보겠습니다. 영수증에 구매 목록이 쭉 나열이 될텐데, 이를 파이썬 프로그램으로 구매목록을 나열한다고 가정해 볼까요. 그럼 어떻게 처리를 하는게 좋을까요? 구매목록이 적게는 1개, 많게는 수십, 수백가지에 이를것입니다. 이럴경우 사용하는게 리스트, 또는 튜플을 이용합니다.

아이템을 하나 구매했는데, 구매 날짜, 품목, 가격. 이렇게 item이라고 하는 변수에 저장을 하게 하였습니다. 단순히 어떤것이 들어있는지 확인해 보았습니다.

item 이라는 변수의 포지션값을 넣어서 각각의 위치에 해당하는 값을 표기하게 하였습니다. 결과를 보니, 순서대로 잘 나오고 있습니다.

또 다른 방법은 item 안에 있는 각각을 대표하는 변수 date, name, cost 라고 하고 여기에 하나씩 저장하게 할 수도 있습니다.

아래와 같이 각각의 변수에 저장을 하게 하고, 출력을 하니 상기 결과값과 일치하네요.

그러나 이러한 식으로 하면 수많은 데이터를 처리해야 할 경우에 번잡해 질 수 있습니다. 가령, 위치값이 잘못 들어가면 완전 다른 값을 산출하게 될 테니까요. 그래서 일반적으로는 아래와 같이 포지션 값을 따로 설정하지 않게 하는 방식을 많이 사용을 합니다.

포지션 값 설정 없이 각각의 변수에 값들을 저장하고 그 결과를 출력하게 하였습니다.

그렇다면 위와 같은 방식이 일반적이냐? 그렇지는 않습니다. 왜냐하면 리스트, 튜플의 개수가 3개 일수도 있고, 5개 일수도 있고, 심지어 이보다 훨씬 길 수도 있으니까요. 그래서 파이썬에서는 유연한 프로그래밍을 하기 위한 도구로 * 를 활용합니다. 일전에도 언급한 적이 있지만, 다시 한번 얘기하겠습니다.

만약, list 라는 변수에 1,2,~~9,10 까지 10개의 값이 존재한다고 할 때, 필요한 값은 2~9까지라고 가정하겠습니다. 그럼 2번째 부터 9번 째 값까지 하나씩 코딩을 해야 할까요? 인간은 호모 사피엔스인데, 그런 노가다(삽질)를 해야할까요? 그렇지 않습니다. 바로 위에서 언급한 * 를 활용하면 됩니다. 아래 예제를 통해 활용성을 알아보겠습니다.


예제. 언제부턴가 TV를 보면 오디션 프로그램이 넘쳐나고 있습니다. 여기에 심사위원들이 많이 있을텐데요. 공정성을 기하기 위해 10명의 심사위원 점수를 최하점과, 최고점을 제외하고 평균을 내어보도록 하겠습니다. 아마 스포츠 경기나, 오디션 프로그램에서 이런 시스템을 보신적이 있으실겁니다.

우선, 첫 숫자와 마지막 숫자를 계산에서 제외하는 함수를 정의하겠습니다.

parameter로 전달받은 grades에서 첫 번째와, 마지막을 각각 first, last 변수에 넣어줍니다. 그리고 나머지를 middle 변수에 넣어주겠다는 의미로 *middle 를 사용하였습니다.

이렇게 정의한 middle의 총합을 middle 의 길이(갯수) 로 나누어 평균을 내어 avg(Average: 평균)에 저장을 합니다.

함수 정의가 끝났으니 호출을 해봐야겠죠? 아래 그림과 같이 5개의 점수를 넣어주었습니다. 그리고 56, 78을 제외한 55, 98, 39 의 평균값이 64라고 알려주고 있네요.

이번에는 조금 더 많은 수의 값을 넣어보았습니다. 마찬가지로 56, 18을 제외한 값들의 평균이 75.33333 이라고 알려주고 있네요.

그러나 이는 우리가 애초에 생각하는 값이 아닙니다. 바로 최저값, 최고값을 제외 시킨 값이 아니기 때문이죠.

그래서 아래와 같이 입력값들을 정렬을 해주어 크기순으로 넣어주게 수정을 하였습니다. 여기에서는 39, 98을 제외한 값들의 평균이 63이라고 알려주고 있네요. 


지금까지 List or Tuples의 언패킹(풀기)에 대해 간략하게나마 알아보았습니다. 리스트가 단순하고 정적인 포지션 값을 갖고 있다면 일반적인 포지션 값을 할당하는 방식을 사용하여도 무방합니다. 그러나 복잡하고 때로는 동적인 크기일 경우에는 * 를 잘 활용하면 보다 효율적이고 효과적인 코딩을 하는데 도움이 될 것입니다.