- 7
- 이니스프리
- 조회 수 2226
원래는 0강에서 말씀드린대로 본 강좌에서는 리스트를 다루지 않고 실전으로 넘어갈 계획이었습니다.
그런데 실전편에 들어가기 전에 파이썬의 기본함수 및 메서드를 정리하려고 했는데, 리스트와 관련된 것이 많아서 리스트를 통째로 스킵하기는 애매하더군요.
그래서 이번 강좌에서는 리스트에 관련된 기본함수와 메서드를 정리하려고 합니다.
4~5강은 추후에 다시 올리겠습니다.
컴퓨터 언어에 따라서 자료형으로 배열을 사용하는 언어(C)도 있고, 배열이라는 명칭을 사용하지만 리스트의 기능을 제공하는 경우도 있는데(Javascript), 파이썬에서는 기본적으로 리스트만을 제공합니다.
레퍼런스는 없지만 제가 짧은 지식으로 이해한 바로는, 파이썬에서의 리스트는 복수의 데이터를 일렬로 저장하는 동적인 자료형을 의미합니다.
파이썬은 리스트와 관련된 많은 함수와 메서드를 제공하고 있으며, 특히 List Comprehension이란 특유의 문법이 있습니다.
(List Comprehension에 대해서는 별도의 강좌에서 상세히 다루겠습니다.)
1. 리스트 조작하기
(1) append vs insert vs extend
.append(값) 메서드는 리스트의 가장 뒤에 새로운 요소를 추가합니다.
반면 .insert(인덱스, 값) 메서드를 사용하면 지정한 특정 인덱스에 요소를 추가할 수 있습니다.
arr = [1, 2, 3] arr.insert(2, 100) print(arr)
=> [1, 2, 100, 3]
.insert(len(리스트), 값)은 append(값)과 동일한 역할을 수행합니다.
리스트[len(리스트):] = [값]도 .append()와 마찬가지의 결과를 가져오지만, 문법상 혼동을 가져올 수 있으므로 이번 강좌에서는 이런 것이 있다는 정도만 알아두시면 됩니다.
한편 .extend(리스트)는 리스트의 뒤에 다른 리스트를 연결하는 것으로서 리스트1 + 리스트2와 같은 기능을 수행합니다.
append로 리스트를 추가하면 리스트 안의 요소로 리스트가 들어가게 되지만, extend를 하면 추가한 리스트의 각 요소가 원래 리스트의 개별 요소로 들어가게 되는 차이가 있습니다.
(2) del vs remove()
리스트에서 원하는 요소를 삭제한다는 점에서 양자는 유사합니다.
다만 전자는 del list[인덱스]와 같은 용법으로 사용되고, 후자는 .remove(값)과 같은 용법으로 사용되는 차이가 있습니다.
arr = [1, 2, 3] arr.remove(2) print(arr)
=> [1, 3]
만약 동일한 값을 지니는 복수의 요소가 존재하는 경우에 .remove()를 사용하면 어떻게 될까요?
파이썬의 .remove() 메서드는 최초로 찾은 요소만을 삭제합니다.
이러한 작동방식은 후술할 .index()와 유사합니다.
(3) index & count
.index(값)은 리스트에서 특정 값의 인덱스를 반환합니다.
주의해야 할 점은 동일한 값을 지니는 복수의 요소가 존재하는 경우에 최초로 찾은 인덱스만을 반환한다는 것입니다.
arr = [1, 2, 3, 1, 2] # 1이 두 개 들어있습니다. arr.index(1)
=> 0
한편 .count(값)은 리스트에서 특정 값을 지니는 요소의 개수를 구합니다.
(4) sort() 메서드 vs reverse() 메서드 vs sorted() 함수
.sort()는 리스트를 오름차순으로 정렬합니다.
내림차순으로 정렬하려면 .sort(reverse=True)를 사용하면 됩니다.
반면 .reverse()는 정렬과는 무관하게 리스트 요소의 순서를 반대로 뒤집습니다.
# .sort(reverse=True) arr = [1, 2, 3, 1] arr.sort(reverse=True) print(arr) # .reverse() arr = [1, 2, 3, 1] arr.reverse() print(arr)
=> [3, 2, 1, 1]
=> [1, 3, 2, 1]
한편 문자열에서도 사용했던 arr[::-1]과 같은 방식으로 뒤집는 방법을 리스트에서도 활용할 수 있습니다.
sort() 및 reverse()와 관련하여 저같은 초보자가 자주 실수하는 부분을 말씀드리면, 단순히 a.sort()라고 함으로써 리스트가 정렬되는 것이며, 만약 부주의로 a = a.sort()라고 한다면 a에는 None이 들어가게 됩니다.
그나마 b = a.sort()라고 하는 경우에는, b에 None이 들어가지만 a가 정렬이 되기는 합니다.
이런 경우에 sorted() 함수를 사용하여 b = sorted(a)라고 하면, a 리스트 자체에는 변화를 주지 않으면서 정렬된 결과를 b에 넣을 수 있습니다.
(5) len()
리스트의 요소 개수를 구하는 함수로서 굉장히 많이 활용됩니다.
예컨대 for i in range(len(리스트)): 이런 식으로 자주 사용됩니다.
참고로 PHP 등 일부 언어에서는 유사한 기능을 하는 함수가 count()라는 명칭을 사용하고 있어서 혼동되는 경우가 있습니다.
2. 인덱스와 요소를 함께 다루기 - enumerate()
enumerate() 함수는 리스트 등을 입력받아 인덱스 값을 포함하는 enumerate 객체를 반환합니다.
이는 반복문에서 객체가 현재 몇 번째 루프가 돌고 있는지 인덱스 값이 필요할때 사용하면 유용합니다.
sfu = ['마스타크래프트', '도오밥', '조오국', '펭수우', '협수우'] for idx, nickname in enumerate(sfu): print(idx, name)
=>
0 마스타크래프트
1 도오밥
2 조오국
3 펭수우
4 협수우
(모두 가상의 인물로 상정하고 작성하였습니다 ^^)
3. 리스트 요소의 값 계산하기 - min(), max(), sum()
리스트의 요소 중에서 최소값 또는 최대값을 구할 때에 .sort() 메소드 또는 반복문을 이용할 수도 있지만, 파이썬에서는 리스트에서 최소값&최대값과 합계를 구하는 함수를 기본적으로 제공하고 있습니다.
바로 min(리스트), max(리스트), sum(리스트) 함수입니다.
arr = [1, 2, 3] print(min(arr), max(arr), sum(arr), sep=':')
=> 1:3:6
4. 리스트의 모든 요소를 함수로 처리하기 - map()
리스트의 모든 요소를 원하는 함수로 처리하려면 물론 반복문을 이용할 수도 있지만, map() 함수를 이용하면 보다 간단하게 처리할 수 있습니다.
arr = [1.5, 2.5, 3.5] arr_int = [] for x in arr: arr_int.append(int(x)) print(arr_int)
위 2~4열을 map() 함수를 이용하여 처리한다면 arr_int = list(map(int, arr)) 한 줄로 해결할 수 있습니다.
이는 .append() 메서드를 사용하려면 반드시 리스트가 먼저 선언되어야 하는 것과 차이가 있습니다.
map() 함수는 다양하게 활용할 수 있는데, 예컨대 x, y = map(int, input().split()) 이런 식으로 사용하면 입력받은 두 개의 수를 바로 두 개의 변수에 집어넣을 수 있습니다.
5. Quiz
수 개의 정수를 요소로 하는 리스트 list_x가 주어진 경우, 리스트의 각 정수를 제곱한 값의 평균을 출력하는 스크립트를 작성하시오.
import math # pow() 함수를 사용하기 위해 math 라이브러리를 import 합니다. def square(n): # pow() 함수를 이용하여 square() 함수를 정의합니다. return math.pow(n, 2) result = sum(list(map(square, list_x)))/len(list_x) # map()을 이용해 square() 처리를 한 후에 합계를 리스트의 개수로 나눕니다. print(result)
굳이 pow() 함수를 사용하지 않더라도, ** 연산자를 이용하여 제곱을 처리할 수 있습니다.
6. 마치며
이상으로 리스트와 관련된 함수 및 메서드를 정리하였습니다.
다음 강좌에서는 지금까지 살펴보지 않은 파이썬의 기본함수 및 메서드를 정리하겠습니다.
부족한 강좌를 읽어주셔서 감사합니다 ^^
작성자
댓글 7
감사합니다 ^-^
humit 님께서도 저녁식사 맛있게 드세요~
괜찮으시다면 중간에 빠진 강좌가 올라올 때에 재업으로 순서를 맞춰 주시면...
+ 항상 유익하게 보고 있습니다!
앗... 허접한 강좌를 읽어주셔서 감사합니다!
제가 공부한 내용을 정리해서 올리는 수준이라고 생각하고 있었고, 다른 분들께서 읽어보실거라고는 미처 생각을 못했네요 ㄷㄷ
순서가 뒤죽박죽이 되면 다른 분들께서 글을 넘기면서 보기 번거스러우시겠군요~
일단 빠진 강좌는 제목순서를 맞춰서 올리고, 10강 정도로 이론편이 정리가 되면 내용을 보완해서 다시 재업해서 순서를 맞추겠습니다!
그럼 즐겁고 뜻깊은 연말 되세요 ^-^
이니스프리님도 뜻깊은 연말 되세요!
sort와 reverse 부분을 설명하는 코드에서
arr = [1, 2, 3, 1]
print(arr.sort(reverse=True))
print(arr.reverse())
의 실행결과는 둘 다 None이 출력이 되게 됩니다. 아래 설명에서도 써주셨듯이 sort와 reverse는 해당 객체를 직접 수정하는 것이고 반환값이 None이기 때문에 그렇습니다.
arr = [1, 2, 3, 1]
arr.sort(reverse=True)
print(arr)
arr = [1, 2, 3, 1]
arr.reverse()
print(arr)
말씀해주신 부분은 제가 작성할 때에 정신줄을 놓았네요 -_-;;;
파이썬을 개발하신 분이 굳이 왜 그렇게 함수를 개발하셨는지에 대하여, 저번에 말씀하신 리스트는 mutable하고 스트링은 immutable하다는 점과 연관시켜 생각해보니 조금이나마 이해가 되는군요 :)
덕분에 내일 COS PRO 시험에서도 주의하겠습니다!!
말씀해주신 부분을 포함하여 부족한 부분을 보완해서 내일 글을 다시 작성하겠습니다~
감사합니다 ^-^
ex) a.sort(key=lambda val: len(val)) 의 경우 문자열 길이를 기준으로 정렬합니다.