앞서 우리는 인덱싱과 슬라이싱을 통하여 많은 작업들을 할 수 있음을 보았습니다.
하지만 아무래도 전문적이고 복잡한 작업을 하려면 리스트 객체가 가지고 있는 다양한 연산자와 메소드를 활용해야 합니다.
메소드(method)는 객체(object)가 가지고 있는 함수입니다.
두 개의 리스트를 합칠 때는 연결 연산자인 + 연산자를 사용할 수 있습니다.
marvel_heroes = ["스파이더맨", "헐크", "아이언맨"]
dc_heroes = ["슈퍼맨", "배트맨", "원더우먼"]
heroes = marvel_heroes + dc_heroes
print(heroes)
<실행 결과>
['스파이더맨', '헐크', '아이언맨', '슈퍼맨', '배트맨', '원더우먼']
리스트를 반복하는 것도 반복 연산자인 *을 사용하면 됩니다.
values = [ 1, 2, 3 ] * 3
print(values)
<실행 결과>
[1, 2, 3, 1, 2, 3, 1, 2, 3]
[ 1, 2, 3 ] * 3 에 의하여 [ 1, 2, 3 ] 이 3번 반복되어 리스트 [ 1, 2, 3, 1, 2, 3, 1, 2, 3 ] 이 생성됩니다. [ 1, 2, 3 ] * 3 은 3 * [ 1, 2, 3 ] 과 동일합니다.
len() 연산은 리스트의 길이를 게산하여 반환합니다.
letters = ['a', 'b', 'c', 'd']
print(len(letters))
<실행 결과>
4
append()를 사용하여 리스트의 끝에 새로운 항목을 추가할 수 있습니다.
shopping_list = []
shopping_list.append("두부")
shopping_list.append("양배추")
shopping_list.append("딸기")
print(shopping_list)
<실행 결과>
['두부', '양배추', '딸기']
append() 메소드는 리스트의 끝에 새로운 요소를 추가합니다. 우리는 종종 기존 리스트의 특정한 위치에 새로운 요소를 추가하기를 원합니다.
이런 경우에 사용할 수 있는 메소드가 insert() 입니다. 아래와 같은 리스트의 인덱스 1에 "생수" 를 추가하여 봅시다.
shopping_list = ["두부", "양배추", "딸기"]
shopping_list.insert(1, "생수")
print(shopping_list)
<실행 결과>
['두부', '생수', '양배추', '딸기']
"생수" 항목이 인덱스 1에 추가되었고 이후의 항목들은 모두 뒤로 한 칸 이동하였습니다.
리스트에 어떤 요소가 있는지를 찾는 연산도 많이 사용됩니다. 어떤 요소가 리스트에 있는지 없는지만 알려면 in 연산자를 사용하면 됩니다.
heroes = ["스파이더맨", "슈퍼맨", "헐크", "아이언맨", "닥터스트레인지"]
if "닥터스트레인지" in heroes:
print("도르마무! 거래를 하러 왔다!")

우리는 종종 어떤 요소의 리스트 안에서의 위치를 알아야 합니다. 이런 경우에 사용할 수 있는 메소드가 index() 입니다.
예를 들어 리스트에서 "슈퍼맨"의 인덱스를 알고 싶다면 다음과 같이 합니다.
heroes = ["스파이더맨", "슈퍼맨", "헐크", "아이언맨", "닥터스트레인지"]
index = heroes.index("슈퍼맨") # index는 1이 됩니다.
만약 리스트에 없는 항목을 index()로 찾으면 오류가 발생할 수 있습니다.
따라서 다음과 같이 먼저 리스트에 있는지를 확인한 후에 항목의 인덱스를 찾는 것이 안전합니다.
heroes = ["스파이더맨", "슈퍼맨", "헐크", "아이언맨", "닥터스트레인지"]
if "슈퍼맨" in heroes:
index = heroes.index("슈퍼맨") # index는 1이 됩니다.
pop() 메소드는 특정한 위치에 있는 항목을 삭제합니다. pop(1)을 하면 인덱스 1에 있는 항목이 삭제되는 동시에 반환됩니다.
heroes = ["스파이더맨", "슈퍼맨", "헐크", "아이언맨", "닥터스트레인지"]
heroes.pop(1)
print(heroes)
<실행 결과>
['스파이더맨', '헐크', '아이언맨', '닥터스트레인지']
remove() 메소드는 항목을 받아서 제거합니다. pop()과 다른 점은 항목의 값을 받아서 일치하는 항목을 삭제합니다.
heroes = ["스파이더맨", "슈퍼맨", "헐크", "아이언맨", "닥터스트레인지"]
heroes.remove("슈퍼맨")
print(heroes)
<실행 결과>
['스파이더맨', '헐크', '아이언맨', '닥터스트레인지']
우리는 비교 연산자 ==, !=, >, < 를 사용하여 2개의 리스트를 비교할 수 있습니다.
리스트를 비교하려면, 먼저 2개의 리스트가 동일한 자료형의 요소들을 가지고 있어야 합니다.
리스트의 첫 번째 요소들을 비교할 때 False가 나오면 더 이상의 비교는 없고 False가 그대로 출력됩니다.
첫 번째 요소가 같으면 두 번째 요소를 꺼내서 비교합니다. 리스트 안의 모든 요소가 비교될 때까지 동일한 작업을 반복합니다.
리스트 안의 모든 요소를 비교하여 모두 True가 나오면 전체 결과가 True가 됩니다.
예를 들어 list1과 list2를 == 연산자를 이용하여 비교해보면 첫 번째 요소가 ==로 비교되고 두 번째 요소가 ==로 비교됨을 알 수 있습니다.
리스트의 모든 요소에 대하여 == 연산이 True가 나오면 list1 == list2도 True가 됩니다.
list1 = [1, 2, 3]
list2 = [1, 2, 3]
print(list1 == list2)
<출력 결과>
True
== 를 이용하여 2개의 리스트를 비교할 때, 리스트의 길이가 다르면 False가 됩니다.
list1 = [1, 2, 3]
list2 = [1, 2]
print(list1 == list2)
<실행 결과>
False
> 와 같은 연산자는 어떻게 동작되는 것일까요? 뭐든지 확실하게 알아야 자신 있게 사용할 수 있습니다.
역시 마찬가지로 첫 번째 요소가 > 로 비교되고 이어서 두 번째 요소가 비교됩니다. 리스트 전체 요소에 대하여 > 연산이 True가 나오면 list1 > list2도 True가 됩니다.
list1 = [3, 4, 5]
list2 = [1, 2, 3]
print(list1 > list2)
<실행 결과>
True
리스트 안에서 최소값과 최대값을 찾으려면 내장 메소드인 max()와 min()을 사용하면 됩니다.
values라는 리스트에서 최소값과 최대값을 계산해보면 아래와 같습니다.
values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(min(values))
print(max(values))
<실행 결과>
1
10
리스트의 요소들을 크기 순으로 정렬시키는 연산은 아주 많이 사용됩니다. 리스트를 정렬하는 방법에는 2가지의 방법이 있습니다.
1. sort() 메소드는 리스트를 제자리(in-place)에서 정렬합니다. 따라서 sort()가 호출되면 원본 리스트가 변경됩니다.
a = [3, 2, 1, 5, 4]
a.sort()
print(a)
<실행 결과>
[1, 2, 3, 4, 5]
2. 원본을 유지하고 새로이 정렬된 리스트를 원한다면 내장 함수인 sorted()를 사용하는 것이 좋습니다. sorted()는 정렬된 새로운 리스트를 반환합니다.
a = [3, 2, 1, 5, 4]
b = sorted(a)
print(b)
<실행 결과>
[1, 2, 3, 4, 5]
리스트를 정렬할 때, key 매개 변수를 이용하여 요소들을 비교하기 전에 호출되는 함수를 지정할 수 있습니다.
예를 들어 대소문자를 가리지 않고 비교하려면 key 매개 변수에 str.lower() 함수를 지정할 수 있습니다.
print(sorted("지금 이 순간 마법처럼~ 날 묶어왔던 사슬을 벗어던진다~".split(), key=str.lower))
<실행 결과>
['날', '마법처럼~', '묶어왔던', '벗어던진다~', '사슬을', '순간', '이', '지금']
list.sort()와 sorted()는 모두 bool형의 reverse 매개 변수를 가집니다. 이 매개 변수는 정렬 방향을 지정하는데 사용됩니다.
예를 들어 리스트를 역순으로 정렬하려면 다음과 같이 합니다.
print(sorted([5, 2, 3, 1, 4], reverse=True))
<실행 결과>
[5, 4, 3, 2, 1]
문자열의 split() 메소드는 문자열을 분리하고 이것을 리스트로 만들어서 반환합니다. 이때 문자열을 분리하는 분리자를 지정할 수 있습니다.
만약 분리자가 지정되지 않으면 스페이스를 이용하여 문자열을 분리합니다.
str = "지금 내겐 확신만 있을 뿐~ 남은 건 이제 승리뿐~"
print(str.split())
<실행 결과>
['지금', '내겐', '확신만', '있을', '뿐~', '남은', '건', '이제', '승리뿐~']
만약 ,을 이용하여 문자열을 분리하려고 한다면 다음과 같이 합니다.
str = "내가 제일 좋아하는 건 여름 그 맛, 예!"
print(str.split(","))
<실행 결과>
['내가 제일 좋아하는 건 여름 그 맛', ' 예!']
이제까지 등장한 리스트 관련 연산들을 표로 정리하면 다음과 같습니다.
| 연산의 예 | 설명 |
|---|---|
| mylist[2] | 인덱스 2에 있는 요소 |
| mylist[2] = 3 | 인덱스 2에 있는 요소를 3으로 설정합니다. |
| del mylist[2] | 인덱스 2에 있는 요소를 삭제합니다. |
| len(mylist) | mylist의 길이를 반환합니다. |
| "value" in mylist | "value"가 mylist에 있으면 True입니다. |
| "value" not in mylist | "value"가 mylist에 없으면 True입니다. |
| mylist.sort() | mylist를 정렬합니다. |
| mylist.index("value") | "value"가 발견된 위치를 반환합니다. |
| mylist.append("value") | 리스트의 끝에 "value" 요소를 추가합니다. |
| mylist.remove("value") | mylist에서 "value"가 나타나는 위치를 찾아 삭제합니다. |