Python 리스트의 조작

공유하기

  • Add this entry to Hatena Bookmark
  • 0

이 글의 소스 샘플은 [Google Colab에서 Python 코드 실행하기] 글에서 언급한 환경을 이용하면 Python 프로그램을 PC에 설치하지 않더라도 Chrome, IE, Edge의 Browser에서 쉽게 Python프로그램을 실행하고 따라할 수 있습니다.

리스트란?

어떤 형태의(정수, 부동소수점, 문자열 등)의 데이터를 저장할 수 있는 데이터 구조입니다. 각 요소에 순서가 있으며 인덱스를 이용하여 각 요소를 지정할 수 있습니다. 리스트의 요소는 자유롭게 수정할 수 있으며 다른 프로그래밍 언어에서의 ‘배열’과 비슷한 방법으로 사용합니다.

자세한 내용은 아래 글을 참조하세요.

이 글의 소스 샘플은 글에서 언급한 환경을 이용하면 Python 프로그램을 PC에 설치하지 않더라도 Chrome, IE,...

리스트의 요소 개수를 구하는 len함수

len 함수는 리스트가 가지고 있는 요소의 개수를 출력하는 함수입니다. 문자열이나 리스트 등 '요소에 순서'가 있는 반복 가능 오브젝트 또는, 사전이나 집합과 같이 '요소에 순서'가 없는 컬렉션 등에 지정할 수 있습니다.

ex1list = list(range(6))
print(ex1list)
print(len(ex1list))

실행 결과는 다음과 같습니다.

[0, 1, 2, 3, 4, 5]
6

최대/최소의 요소를 취득하는 max/min함수

문자열과 마찬가지로, 리스트에 저장되어 있는 요소 중 최대값을 취득할 때 max 함수를, 최소값을 취득할 때 min 함수를 사용합니다.

max(iterable, key, default)
min(iterable, key, default)
  • iterable : 대상 리스트.
  • key : 키워드 인수로만 지정할 수 있다. 리스트의 요소를 비교할 때 사용하는 키를 꺼내는 함수.(생략 가능)
  • default : 키워드 인수로만 지정할 수 있다. iterable이 생략되었을 경우에 반환값이 된다.(생략 가능)

iterable이 비어있을 때 default이 지정되지 않으면 Value Error가 발생합니다.

ex2list = [1, 3, 5, 6, 9, -7, -8]
print(max(ex2list))
print(min(ex2list))

실행 결과는 다음과 같습니다.

9
-8

key에는 리스트의 요소를 인수로서 받을 함수를 지정합니다. 최대/최소의 요소를 산출할 때는 각 요소를 이 함수에 넘겨서 얻은 값끼리 비교합니다. 아래의 예시에서는 max 함수의 호출로 임베디드 abs 함수를 키워드 인수의 형태로 전달합니다. abs함수는 값의 절대값을 취득하기 때문에 최소값이 -5가 아닌 1이 출력됩니다.

ex3list = [1,2,3,4,5,-1,-2,-3,-4,-5]
print('max(abs):', max(ex3list, key=abs))
print('min(abs):', min(ex3list, key=abs))

실행 결과는 다음과 같습니다.

max(abs): 5
min(abs): 1

default에는 iterable의 값이 비어 있었을 경우, 리턴값을 키워드 인수로 전달합니다. 외부에서 얻은 반복가능 오브젝트를 max/min 함수에 넘길 경우에는 리턴값이 비어있는 경우도 있습니다. 이런 경우에는 최대값도 최소값도 존재하지 않기 때문에 보통 Value Error 예외가 발생하지만 아래와 같이 default값을 지정해두면 오류를 방지할 수 있습니다.

print(max([], default='no item'))

리스트를 max/min 함수에 넘길 경우에는 그 모든 요소가 비교 가능한 값이어야 합니다. 예를 들어, 문자열과 정수값은 비교할 수 없습니다. 값에 따라서는 key에 형을 변환해주는 int 함수나 str 함수를 지정할 수도 있습니다.

print(min([2, '1'], key=int))
print(max([1, 2, 'foo'], key=str))
print(max([2, '1']))

실행 결과는 다음과 같습니다.

1
foo
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-fdcdedb1b906> in <module>()
      1 print(min([2, '1'], key=int))
      2 print(max([1, 2, 'foo'], key=str))
----> 3 print(max([2, '1']))

TypeError: '>' not supported between instances of 'str' and 'int'

리스트의 결합과 곱셈

문자열과 마찬가지로 리스트도 '+' 연산자를 사용한 결합, '*' 연산자를 사용한 곱셈 연산을 할 수 있습니다. '리스트 * 정수값' 또는 '정수값 * 리스트'로 기술하는데, 리스트를 정수값만큼의 횟수를 반복한 결과를 반환합니다.

print([1, 2] + [3, 4])
print(5 * ['a'])

실행 결과는 다음과 같습니다.

[1, 2, 3, 4]
['a', 'a', 'a', 'a', 'a']

리스트에 특정 요소가 포함되어 있는지 확인하는 in연산자

리스트에 특정 요소가 포함되어 있는지를 확인하려면 in연산자, 포함되어 있지 않은지를 확인하려면 not in연산자를 사용합니다. '조사하고 싶은 값 in 리스트'로 쓰며 알고 싶은 값이 포함되어 있으면 연산 결과는 True를, 포함되어 있지 않으면 연산 결과는 False를 반환합니다. 특정 요소가 포함되어 있지 않은지 확인하려면 '조사하고 싶은 값 not in 리스트'로 씁니다. 해당 값이 리스트에 포함되지 않으면 연산 결과는 True를, 포함되어 있으면 연산 결과는 False를 반환합니다.

print('foo' in ['foo', 'bar'])
print('hoge' not in ['foo', 'bar'])
print('foobar' in ['foo', 'bar'])
print('bar' not in ['foo', 'bar'])

실행 결과는 다음과 같습니다.

True
True
False
False

요소가 저장되어있는 인덱스를 취득하는 index 메소드

특정 요소가 리스트에 포함되어 있는지, 포함되어 있지 않은지에 대한 확인을 할 때는 in연산자를 사용할 수 있지만 몇 번째 요소인가까지를 알고 싶을 때에는, 리스트의 index 메소드를 사용합니다.

리스트에 아이템이 포함되어 있는지를 조사하고, 포함되어 있으면 그 인덱스를 반환합니다. 동일한 아이템이 복수일 때는 가장 작은 인덱스가 반환됩니다. start와 end에는 검색할 범위의 시작값과 끝값을 지정합니다. 인덱스 start ~ 인덱스 end-1 의 범위가 검색 대상이 됩니다. 지정한 범위에 지정값이 포함되지 않을 때는 Value Error 예외가 발생합니다.

ex4list = [0, 10, 9, 2, -7, -10, -2, -9, -7, 3]
print(ex4list.index(-7))
print(ex4list.index(-7, 5))
print(ex4list.index(3, 0, 9))

실행 결과는 다음과 같습니다.

4
8
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-1-e296bf42ecc6> in <module>()
      2 print(ex4list.index(-7))
      3 print(ex4list.index(-7, 5))
----> 4 print(ex4list.index(3, 0, 9))

ValueError: 3 is not in list

복수의 -7를 가진 리스트 안에서 -7의 인덱스를 출력하려고 하자 가장 값이 작은 인덱스인 '4'가 출력됩니다. 두번째 호출에서도 -7의 인덱스를 검색하지만 인덱스 5 이후를 검색 범위로 지정했기 때문에 두 번째 -7의 인덱스인 8이 반환됩니다. 세번째 호출에서는 start 값으로 0, end 값으로 9를 지정했지만 실제로는 9보다 1적은 인덱스8까지를 검색 대상으로 보기 때문에 인덱스 9를 가진 아이템 3을 찾지 못하여 에러가 발생하게 됩니다.

지정한 요소가 몇 개의 리스트에 저장되어있는지 세는 count 메소드

특정 요소가 리스트 안에 몇 개인지를 알아보려면 count 메소드를 사용합니다.

ex5list = [0, 10, 9, 2, -7, -10, -2, -9, -7, 3]
print(ex5list.count(1))

실행 결과는 다음과 같습니다.

0

위의 예시는 리스트에 포함된 정수 값 '1'의 개수를 조사하고 있습니다. ex5list에는 1이 존재하지 않기 때문에 0이 반환됩니다.

리스트를 정렬하는 sort 메소드/sorted함수

리스트의 요소를 특정 순서로 정렬할 때는 리스트의 sort 메소드 혹은 sorted 함수를 사용할 수 있습니다.

sort 메소드

리스트명.sort(key, reverse=True/False)

sort 메소드는 리스트 각 요소를 기본적으로 오름차순으로 정렬합니다. 키워드 인수 key에는 비교할 때 키가 되는 값을 산출하는 함수를 지정합니다. reverse의 디폴트 값은 False로, 오름차순이지만 True를 지정하면 내림차순으로도 정렬할 수 있습니다. key와 reverse는 생략할 수 있습니다.

ex7list = [1, 3, -2, -8, 9, 2, 4, -5, -6, 7]
ex7list.sort()
print(ex7list)

실행 결과는 다음과 같습니다.

[-8, -6, -5, -2, 1, 2, 3, 4, 7, 9]

파라미터를 지정하지 않은 위의 예시에서는 리스트의 요소들이 오름차순으로 출력된 것을 확인할 수 있습니다.

ex7list = [1, 3, -2, -8, 9, 2, 4, -5, -6, 7]
ex7list.sort(reverse=True)
print(ex7list)

실행 결과는 다음과 같습니다.

[9, 7, 4, 3, 2, 1, -2, -5, -6, -8]

reverse를 True로 지정한 위의 예시에서는 리스트의 요소들이 내림차순으로 출력된 것을 확인할 수 있습니다.

ex7list = [1, 3, -2, -8, 9, 2, 4, -5, -6, 7]
ex7list.sort(key=abs)
print(ex7list)

실행 결과는 다음과 같습니다.

[1, -2, 2, 3, 4, -5, -6, 7, -8, 9]

key를 abs(파라미터로 받은 수치의 절대값을 반환하는 함수)로 지정한 위의 예시에서는 각 요소의 절대값으로 정렬한 것을 확인할 수 있습니다. reverse는 지정하지 않았기 때문에 디폴트인 오름차순으로 출력됩니다.

sorted 함수

sort 메소드는 실행시키고 나면 리스트 내의 순서가 정렬된 결과대로 바뀝니다. 본래의 순서를 유지한 채 정렬 결과를 알고 싶을 때는 sorted 함수를 사용할 수 있습니다.

ex8list = [1, 3, -2, -8, 9, 2, 4, -5, -6, 7]

result = sorted(ex8list, key=abs)
print(ex8list)
print(result)

실행 결과는 다음과 같습니다.

[1, 3, -2, -8, 9, 2, 4, -5, -6, 7]
[1, -2, 2, 3, 4, -5, -6, 7, -8, 9]

ex8list를 출력하자 기존의 순서대로 요소들이 출력되고, sorted 함수를 사용한 리스트를 가진 변수 result의 요소는 절대값을 기준으로 정렬되어 출력된 것을 확인할 수 있습니다.

또한 문자열 요소의 정렬에는 아래와 같은 특징이 있습니다.

strlist = ['ab', 'Ab', 'de', 'dE', 'Abc']
print(sorted(strlist))

실행 결과는 다음과 같습니다.

['Ab', 'Abc', 'ab', 'dE', 'de']

알파벳의 코드 포인트가 작은 값일수록 작다고 간주되며 2개 이상의 문자열은 첫번째 문자, 두번째 문자, 순서로 비교합니다. 동일한 값을 가진 복수의 문자열이 있고 가장 마지막에 한 글자만 추가된 경우(위의 'Ab'와 'Abc')에는 문자열의 길이가 짧은 쪽이 작은 값으로 간주됩니다.

key 파라미터의 문자열을 모두 소문자 혹은 대문자로 통일하여 정렬할 수도 있습니다.

print(sorted(strlist, key=str.lower))

실행 결과는 다음과 같습니다.

['ab', 'Ab', 'de', 'dE']

위의 예시에서는 lower 메소드를 사용하여 모든 요소를 소문자로 바꾸어 소문자끼리 비교하였습니다. 이처럼 대소문자를 구분하지 않아도 되는 정렬에서는 lower, upper 메소드를 사용할 수 있습니다.

리스트를 반전시키는 reverse메소드/reversed함수

리스트의 요소를 역순으로 정렬할 때는 reverse 메소드와 reversed 함수를 사용할 수 있습니다. reverse 메소드는 본래의 리스트를 다시 쓰는 것이고, reversed 함수는 본래 리스트의 요소를 인수로 취하여 역순으로, 데이터를 반복적으로 꺼내는 것이 가능한 이터레이터(Iterator) 오브젝트를 반환합니다. sorted 함수는 원래의 리스트를 정렬시킨 리스트를 반환했지만, reversed 함수는 이터레이터 오브젝트를 반환한다는 점이 다르므로 주의가 필요합니다.

ex10list1 = list(range(6))
print(ex10list1)

실행 결과는 다음과 같습니다.

[0, 1, 2, 3, 4, 5]

우선 위와 같은 예제 리스트를 정의합니다. ex10list1에 reverse 메소드를 실행시키면 아래와 같이 요소가 역순으로 출력되는 것을 확인할 수 있습니다.

ex10list1.reverse()
print(ex10list1)

실행 결과는 다음과 같습니다.

[5, 4, 3, 2, 1, 0]

아래는 reversed 함수를 이용한 예시입니다.

ex10list2 = ['a', 'b', 'c', 'd']
ex10list3 = list(reversed(ex10list2))
print(ex10list2)
print(ex10list3)

실행 결과는 다음과 같습니다.

['a', 'b', 'c', 'd']
['d', 'c', 'b', 'a']