Python 기초

리스트의 기초 연산들

앞서 우리는 인덱싱과 슬라이싱을 통하여 많은 작업들을 할 수 있음을 보았습니다.

하지만 아무래도 전문적이고 복잡한 작업을 하려면 리스트 객체가 가지고 있는 다양한 연산자와 메소드를 활용해야 합니다.

메소드(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가지의 방법이 있습니다.

  • 리스트 객체의 sort() 메소드를 사용하는 방법
  • sorted() 내장 함수를 사용하는 방법

 

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"가 나타나는 위치를 찾아 삭제합니다.