본문 바로가기

공부/python

(python) 리스트 2 - 시퀀스 자료형, 시퀀스에서 가능한 연산과 함수, 인덱싱, 슬라이싱, 리스트의 기초 연산

파이썬에서 리스트는 넓게 보면 시퀀스(sequence) 자료형에 속한다.

시퀀스에 속하는 자료형들은 순서를 가진 요소들의 집합이라는 공통적인 특성을

가지고 있다. 공식적으로 시퀀스 자료형에는 다음과 같은 6가지의 자료형이 있다.

  • 문자열
  • 바이트 시퀀스
  • 바이트 배열
  • 리스트
  • 튜플
  • range 객체 (시퀀스 연산들이 적용 안되는 것이 많음)

문자열, 리스트, 튜플, 바이트, range 객체들은 상당히 다르게 보이지만, 자세히 살펴보면

다음과 같은 공통적인 특징을 가지고 있다.

  • 요소들은 순서를 가지고 있다.
  • 요소들은 인덱스를 사용하여 참조할 수 있다.

다음의 예를 보자.

문자열과 마찬가지로 리스트도 인덱싱이 가능하다.

다른 언어와는 다르게 파이썬은 시퀀스에 해당되는 자료형에는 동일한 연산자와 함수를

사용할 수 있다. 예를 들어 문자열의 길이나 리스트의 길이는 len()이라고 불리는 함수로

계산할 수 있다.

 

시퀀스에서 가능한 연산과 함수

함수나 연산자 설명 결과
len() 길이 계산 len([1, 2, 3]) 3
+ 2개의 시퀀스 연결 [1, 2] + [3, 4, 5] [1, 2, 3, 4, 5]
* 반복 ['Welcome!'] * 3 ['Welcome!', 'Welcome!', 'Welcome!']
in 소속 3 in [1, 2, 3] True
not in 소속하지 않음 5 not in [1, 2, 3] True
[] 인덱스 myList[1] myList의 1번째 요소
min() 시퀀스에서 가장 작은 요소 min([1, 2, 3]) 1
max() 시퀀스에서 가장 큰 요소 max([1, 2, 3]) 3
for 루프 반복 for x in [1, 2, 3]:
    print(x)
1 2 3

 

인덱싱과 슬라이싱

인덱싱(indexing)이란 리스트에서 하나의 요소를 인덱스 연산자를 통하여 참조(접근)하는 것을

의미한다. 인덱스는 정수이며, 항상 0부터 시작한다.

 

음수 인덱싱

리스트의 인덱스는 0에서 리스트 길이 - 1까지의 범위를 가진다.

 

 

리스트 이름[인덱스]는 하나의 변수와 똑같이 사용가능하다. 아래의 예를 보자.

shopping_list[0]의 값을 변수 item에 할당할 수 있다.

 

슬라이싱

슬라이싱(slicing)은 리스트 안에서 범위를 지정하여서 원하는 요소들을 선택하는

연산이다.

리스트이름[start : end]와 같은 형식으로 사용한다. start인덱스에 있는 요소부터

(end - 1)인덱스에 있는 요소까지 선택된다.

슬라이싱은 새로운 리스트를 반환한다.

슬라이신 연산은 요구된 요소를 포함하는 부분 리스트를 반환한다. 즉 슬라이싱 연산을

하면 리스트의 새로운 복사본을 얻을 수 있다는 이야기이다.

 

슬라이싱 연산에서 시작 인덱스와 종료 인덱스는 생략될 수 있다. 인덱스가 생략되면

시작 인덱스는 0이 되고, 종료 인덱스는 (리스트길이 - 1)가 된다.

 

추가로 리스트는 변경 가능하다.

슬라이싱에 값을 대입하는 것도 가능하다.

리스트의 크기 변경과 공백 리스트로 대체하여 리스트의 내용을 삭제할 수 있다.

 

리스트의 기초 연산

전문적이고 복잡한 작업을 하려면 리스트 객체가 가지고 있는 다양한 연산자와 메소드를

활용하여야 한다. 메소드(method)는 객체(object)가 가지고 있는 함수이다.

 

두개의 리스트를 합칠 때는 연결 연산자인 '+ 연산자'를 사용할 수 있다. 반복해서 더할 때는

'* 연산자'를 사용한다.

-----

리스트의 길이

len() 연산은 리스트의 길이를 계산하여 반환한다.

-----

요소 추가하기

append()를 사용하여서 리스트의 끝에 새로운 항목을 추가할 수 있다.

-----

요소 삽입하기

append() 메소드는 리스트의 끝에 새로운 요소를 추가한다.

특정한 위치에 새로운 요소를 추가하기 위해서는 insert()메소드를 사용한다.

-----

요소 찾기

어떤 요소가 리스트에 있는지 없느지만 알려면 in연산자를 사용하면 된다.

-----

요소 찾기

어떤 요소의 리스트 안에서의 위치를 알려면 index()을 사용한다.

-----

요소 삭제하기

pop()메소드는 특정한 위치에 있는 항목을 삭제하면서 값 반환한다.

-----

요소 삭제하기

remove()메소드는 특정한 값이 리스트에 있으면 해당 원소를 삭제한다.

-----

리스트 일치 검사

우리는 비교 연산자 ==, !=, >, <를 사용하여 2개의 리스트를 비교할 수 있다.

리스트를 비교하려면, 먼저 2개의 리스트가 동일한 자료형의 요소들을 가지고 있어야

한다.

리스트의 첫 번째 쵸소들을 비교하고, False가 나오면 더 이상의 비교는 없고 False가

그대로 출력된다. 첫 번째 요소가 같으면 두 번째 요소를 꺼내서 비교한다.

리스트 안의 모든 요소를 비교하여 모두 True가 나오면 전체 결과가 True가 된다.

 

==, !=

>, <

첫 번째 요소가 >로 비교되고 이어서 두 번째 요소가 비교된다.

리스트 전체 요소에 대하여 > 연산이 True가 나오면 True, 아니면 False가 나온다.

햇갈릴 수 있으니 주의하자.

-----

리스트 최소값과 최대값 찾기

리스트 안에서 최소값과 최대값을 찾으려면 내장 메소드인 max()와 min()을

사용하면 된다.

-----

리스트 정렬하기

리스트의 요소들을 크기 순으로 정렬시키는 연산은 많이 사용된다.

리스트를 정렬하는 방법에는 2가지 방법이 있다.

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

sort()메소드는 리스트는 리스트를 제자리(in-place)에서 정렬한다.

따라서 sort()가 호출되면 원본 리스트가 변경된다.

원본을 유지하고 새로이 정렬된 리스트를 원한다면 내장 함수인 sorted()를

사용하는 것이 좋다. sorted()는 정렬된 새로운 리스트를 반환한다.

리스트를 정렬할 때, key 매개 변수를 이용하여 요소들을 비교하기 전에

호출되는 함수를 지정할 수 있다.

예를 들어 대소문자를 가리지 않고 비교하려면 key 매개 변수에 str.lower()

함수를 지정하면 된다.

리스트를 역순으로 정렬하려면 다음과 같이 하면된다.

-----

문자열에서 리스트 만들기

문자열의 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'가 나타나는 위치를 찾아서 삭제한다.