본문 바로가기

프로그래밍/Python

파이썬(Python) 기초 Step 3. 리스트(list)

○ 리스트란?

리스트는 파이썬 오브젝트의 집합입니다. 달리 말하면, 여러 종류의 데이터를 한 곳에 저장하고 참조할 수 있는 데이터 구조입니다. 리스트는 브라켓([ ]) 안에 콤마( , )를 사용하여 여러가지 데이터를 정의할 수 있습니다.


○ 리스트를 정의하는 방법

빈 리스트를 정의하는 방법은 빈 브라켓([ ])으로 정의하는 방법(예시 1)과 리스트 스트럭처를 사용하는 방법(예시 2)가 있습니다. 

예시 1)

[]

결과 ▷ []
예시 2)

list()

결과 ▷ []

실제로 프로그래밍을 할 때 빈 리스트를 정의해야 하는 경우가 아주 많으니, 반드시 기억해두어야 합니다. 위의 두 방법 중 어느 방법을 사용하여도 상관없으나, 대부분의 파이썬 프로그래머들은 속도가 더 빠르다는 이유로 빈 브라켓([ ])으로 정의하는 방법을 선호하고 있습니다. 실제로 두 가지 방법의 퍼포먼스를 비교해본 결과, 다음과 같이 빈 브라켓을 사용하였을 경우 더 빠르다는 것을 볼 수 있습니다(예시 3) 참조). 하지만 두 방법의 퍼포먼스에서 시간 차이의 단위가 '초(second)'가 아닌 '나노 초(nano second)'이니 어느 쪽을 사용하여도 크게 차이가 없을 것입니다. 

예시 3 - 1) 빈 브라켓을 사용하였을 경우

%timeit []

결과 ▷ 14.9 ns ± 0.0539 ns per loop (mean ± std. dev. of 7 runs. 100000000 loops each)


예시 3 - 2) 리스트 스트럭처를 사용하였을 경우

%timeit list()

결과 ▷ 57 ns ± 0.226 ns per loop (mean ± std. dev. of 7 runs. 100000000 loops each)

1부터 5까지의 숫자를 이용하여 간단한 리스트를 정의하고 출력해보면 (예시 4)와 같습니다. number라는 변수 안에 1부터 5까지의 정수형(int) 데이터가 저장되고 출력된 것을 볼 수 있습니다. type 함수를 사용하여 데이터의 형식을 알아보니 (예시 5)와 같이 데이터의 형식이 list인 것을 알 수 있습니다. 

예시 4)

number = [1, 2, 3, 4, 5]
numbers

결과 ▷ [1, 2, 3, 4, 5]
예시 5)

type(numbers)

결과 ▷ list 

○ 리스트의 기본 기능

리스트는 파이썬이 제공하는 6개의 시퀀스(sequence) 타입 중 하나입니다. 

sequence(시퀀스) : 배열, 순서, 수순, 연속적인 사건들을 일컫는다. 즉, 시퀀스 타입이란 데이터를 배열 및 순서대로 관리할 수 있는 타입을 의미한다.

시퀀스 타입은 순서가 있는 데이터이므로 숫자로 된 Index를 통하여 내부 데이터에 접근할 수 있습니다. Index를 사용하여 string 데이터에 접근이 가능한 것 처럼 list 데이터 또한 Index를 사용하여 접근이 가능합니다. 슬라이싱을 할 수도 있습니다. string(문자열), Index(인덱스), slicing(슬라이싱)에 대한 자세한 내용은 아래 링크를 참조하시면 됩니다.

2019/08/15 - 파이썬(Python) 기초 Step 2. 문자열(String)

(1) 인덱스를 사용한 리스트의 데이터 출력

Index를 사용하여 list의 첫 번째 데이터(예시 5)의 결과 (1))와 마지막 데이터(예시 5)의 결과 (2))를 출력할 수 있고, reverse Index를 사용하여 마지막 데이터를 출력할 수도 있습니다(예시 6)의 결과 (3) 참조).

예시 6)

numbers = [1, 2, 3, 4, 5]
numbers[0]
numbers[4]
numbers[-1]

결과 (1) ▷ 1
결과 (2) ▷ 5
결과 (3) ▷ 5

(2) 슬라이싱을 사용한 리스트의 데이터 출력

슬라이싱을 사용하여 첫 번째부터 순서대로 3개의 데이터를 출력할 수 있습니다(예시 7)의 결과 (1) 참조). Index가 0부터 시작할 때에는 start 번호를 생략해도 됩니다(예시 7)의 결과 (2) 참조). 이어서 끝에서부터 3개의 데이터를 출력해보면 (예시 7)의 결과 (3))과 같습니다.

예시 7)

numbers = [1, 2, 3, 4, 5]
numbers[0 : 3]
numbers[ : 3]
numbers[-3 : ]

결과 (1) ▷ [1, 2, 3]
결과 (2) ▷ [1, 2, 3]
결과 (3) ▷ [3, 4, 5]

(3) 이터레이터(iterator) 기능

파이썬에서 이터레이터(iterator) 기능은 중요한 기능 중 하나입니다. 파이썬 오브젝트 중에는 for문에서 사용이 가능한 이터레이터(iterator) 오브젝트가 있습니다.

iterator(이터레이터) : 계산 및 컴퓨터 처리 절차에 있어서의 반복을 의미한다. 프로그래밍에서는 어떠한 조건이 만족될 때까지 명령 또는 명령문을 반복하여 실행하는 것을 의미한다.

리스트도 이터레이터 오브젝트이며, 포룹을 사용하여 각각의 데이터에 접근할 수 있습니다. 한 오브젝트가 이터레이터 오브젝트인지의 여부는 함수를 사용하여 확인할 수 있습니다(예시 8)의 결과 (1) 참조). 또한 sring 오브젝트도 이터레이터 오브젝이인지 확인하면 (예시 8)의 결과 (2))와 같습니다. 

예시 8)

numbers = [1, 2, 3, 4, 5]
iter(numbers)
iter('string')

결과 (1) ▷ <list_iterator at 0x287f4810c88>
결과 (2) ▷ <str_iterator at 0x287f4827198>

for문을 사용하여 리스트 안에 있는 각각의 데이터를 출력해보면 (예시 9)의 결과 (1))와 같습니다. (예시 8)의 결과(2))에서 확인했듯이 string 또한 이터레이터 오브젝트이기 때문에 for문을 사용하여 데이터를 출력할 수 있습니다(예시 9)의 결과 (2) 참조).

예시 9)

numbers = [1, 2, 3, 4, 5]
for i in numbers :
	print(i)
    
for i in 'sting' :
	print(i)
    
결과 (1) ▷ 1
            2
            3
            4
            5
                
결과 (2) ▷ s
            t
            r
            i
            n
            g
            

(4) 컨캐이트내이트(concatenate) 기능

 

이 기능은 플러스 연산자( + )를 사용하여 두 개의 리스트를 하나로 합치는 기능입니다(예시 10) 참조). 엑셀(Excel)에서 CONCATENATE 함수와 동일한 기능을 한다고 생각하면 될 것 같습니다.

예시 10)

list_1 = [1, 2, 3]
list_2 = [4, 5, 6]
list_new = list_1 + list_2 
list_new

결과 ▷ [1, 2, 3, 4, 5, 6]

(5) 리스트 복제 기능

에스터리스크(asterisk) 연산자( * )를 사용하여 리스트를 복제할 수 있습니다(예시 11) 참조).

예시 11)

list_1 = [1, 2, 3]
list_1 * 3

결과 ▷ [1, 2, 3, 1, 2, 3, 1, 2, 3] 

○ 리스트 클래스가 제공하는 함수 및 메소드 사용 방법

(1) help함수를 사용하여 리스트 클래스의 메소드 확인

리스트 클래스에 정의된 클래스 메소드는 help함수를 사용하여 확인할 수 있습니다(예시 12) 참조). 

예시 12)

help(list)

결과 ▷
Help on class list in module builtins:

class list(object)
 |  list(iterable=(), /)
 |  
 |  Built-in mutable sequence.
 |  
 |  If no argument is given, the constructor creates a new empty list.
 |  The argument must be an iterable if specified.
 |  
 |  Methods defined here:
 |  
 |  __add__(self, value, /)
 |      Return self+value.
 |  
 |  __contains__(self, key, /)
 |      Return key in self.
 |  
 |  __delitem__(self, key, /)
 |      Delete self[key].
 |  
 |  __eq__(self, value, /)
 |      Return self==value.
 |  
 |  __ge__(self, value, /)
 |      Return self>=value.
 |  
 |  __getattribute__(self, name, /)
 |      Return getattr(self, name).
 |  
 |  __getitem__(...)
 |      x.__getitem__(y) <==> x[y]
 |  
 |  __gt__(self, value, /)
 |      Return self>value.
 |  
 |  __iadd__(self, value, /)
 |      Implement self+=value.
 |  
 |  __imul__(self, value, /)
 |      Implement self*=value.
 |  
 |  __init__(self, /, *args, **kwargs)
 |      Initialize self.  See help(type(self)) for accurate signature.
 |  
 |  __iter__(self, /)
 |      Implement iter(self).
 |  
 |  __le__(self, value, /)
 |      Return self<=value.
 |  
 |  __len__(self, /)
 |      Return len(self).
 |  
 |  __lt__(self, value, /)
 |      Return self<value.
 |  
 |  __mul__(self, value, /)
 |      Return self*value.
 |  
 |  __ne__(self, value, /)
 |      Return self!=value.
 |  
 |  __repr__(self, /)
 |      Return repr(self).
 |  
 |  __reversed__(self, /)
 |      Return a reverse iterator over the list.
 |  
 |  __rmul__(self, value, /)
 |      Return value*self.
 |  
 |  __setitem__(self, key, value, /)
 |      Set self[key] to value.
 |  
 |  __sizeof__(self, /)
 |      Return the size of the list in memory, in bytes.
 |  
 |  append(self, object, /)
 |      Append object to the end of the list.
 |  
 |  clear(self, /)
 |      Remove all items from list.
 |  
 |  copy(self, /)
 |      Return a shallow copy of the list.
 |  
 |  count(self, value, /)
 |      Return number of occurrences of value.
 |  
 |  extend(self, iterable, /)
 |      Extend list by appending elements from the iterable.
 |  
 |  index(self, value, start=0, stop=9223372036854775807, /)
 |      Return first index of value.
 |      
 |      Raises ValueError if the value is not present.
 |  
 |  insert(self, index, object, /)
 |      Insert object before index.
 |  
 |  pop(self, index=-1, /)
 |      Remove and return item at index (default last).
 |      
 |      Raises IndexError if list is empty or index is out of range.
 |  
 |  remove(self, value, /)
 |      Remove first occurrence of value.
 |      
 |      Raises ValueError if the value is not present.
 |  
 |  reverse(self, /)
 |      Reverse *IN PLACE*.
 |  
 |  sort(self, /, *, key=None, reverse=False)
 |      Stable sort *IN PLACE*.
 |  
 |  ----------------------------------------------------------------------
 |  Static methods defined here:
 |  
 |  __new__(*args, **kwargs) from builtins.type
 |      Create and return a new object.  See help(type) for accurate signature.
 |  
 |  ----------------------------------------------------------------------
 |  Data and other attributes defined here:
 |  
 |  __hash__ = None

(2) 데이터 추가

리스트에 데이터를 추가하는 append 메소드를 통해 데이터를 추가할 수 있습니다(예시 13) 참조).

예시 13)

numbers = [1, 2, 3, 4, 5]
numbers.append(6)
numbers

결과 ▷ [1, 2, 3, 4, 5, 6]

(3) 리스트의 결합

extend함수를 사용하여 리스트와 리스트를 연결할 수 있습니다(예시 14) 참조).

예시 14)

numbers = [1, 2, 3, 4, 5]
numbers_extend = [6, 7, 8]
numbers.extend(numbers_extend)
numbers

결과 ▷ [1, 2, 3, 4, 5, 6, 7, 8]

리스트와 리스트를 결합할 때에는 플러스( + ) 연산자 또는 extend함수를 사용해야 합니다. 만약, append메소드를 사용하게 되면 (예시 15)와 같이 하나의 리스트 안에 또 다른 리스트가 생성됩니다.

예시 15)

numbers = [1, 2, 3, 4, 5]
numbers_append = [6, 7]
numbers.append(numbers_append)
numbers

결과 ▷ [1, 2, 3, 4, 5, [6, 7]]

(4) 원하는 위치에 데이터 추가

원하는 위치에 새로운 데이터를 추가하고자 할 때에는 insert메소드를 사용하면 됩니다. (예시 16)은 numbers라는 이름의 리스트를 정의했는데, 3을 빠뜨린 경우입니다. 여기서 우리가 추가하고자 하는 3의 Index는 2이며, index메소드의 괄호 안에 차례대로 (index, 삽입할 데이터)를 입력하면 됩니다.

예시 16)

numbers = [1, 2, 4, 5]
numbers.inset(2, 3)
numbers

결과 ▷ [1, 2, 3, 4, 5]

(5) 원하는 데이터 삭제

반대로 remove메소드를 사용하여 데이터를 삭제할 수 있습니다. (예시 17)은 numbers라는 이름의 리스트를 정의했는데, 순서에 맞지 않은 8을 삭제해야 하는 경우입니다. remove메소드는 insert메소드와는 다르게 Index번호를 사용하는 것이 아닌 삭제하고자 하는 값을 입력하여 삭제해야 합니다. 만약에 삭제하고자 하는 값이 리스트에 존재하지 않는 값이면 ValueError가 발생합니다. 또한 리스트 안에 있는 데이터 중에 중복된 데이터를 제거할 때에 remove메소드를 사용하면 Index번호가 작은 값부터 삭제되며, 한꺼번에 삭제되지는 않습니다. 

예시 17)

numbers = [1, 2, 3, 8, 4, 5]
numbers.remove(8)
numbers

결과 ▷ [1, 2, 3, 4, 5]

(6) 원하는 데이터 출력

pop메소드를 사용하여 리스트 안에 있는 데이터 중 원하는 데이터를 출력할 수 있습니다. pop메소드를 사용할 때에는 출력하고자 하는 index 번호를 괄호 안에 입력하면 됩니다(예시 18) 결과(1) 참조). 만약 리스트에 있는 데이터의 Index 번호를 확인하고자 한다면 index메소드를 사용하면 됩니다(예시 18) 결과 (2) 참조). 

예시 18)

numbers = [1, 2, 3, 4, 5]
numbers.pop(0) 
numbers.index(1)

결과 (1) ▷ 1
결과 (1) ▷ 0

(7) 리스트 길이 확인과 특정 데이터의 수량 파악

파이썬이 기본적으로 제공하는 내장 함수인 len함수를 사용하면 리스트의 데이터의 수량 즉, 리스트의 길이를 확인할 수 있습니다. len함수를 사용하여 리스트의 길이를 확인해보면 (예시 19) 결과 (1) 참조)과 같이 numbers라는 리스트에 5개의 데이터가 있다는 것을 확인할 수 있습니다. 또한 count메소드를 사용하여 리스트 안에 있는 특정한 데이터의 갯수를 파악할 수 있습니다(예시 19) 결과 (2) 참조).

예시 19)

numbers = [1, 1, 1, 2, 3]
len(numbers)
numbers.count(1)

결과 (1) ▷ 5
결과 (2) ▷ 3

(8) 리스트의 데이터 순서를 역순으로

reverse메소드를 사용하여 리스트의 순서를 역순으로 바꿀 수 있습니다(예시 20) 참조).

예시 20)

numbers = [1, 2, 3, 4, 5]
numbers.reverse()
numbers

결과 ▷ [5, 4, 3, 2, 1]

(9) 데이터의 정렬

파이썬은 리스트의 데이터를 순서대로 정의할 수 있도록 sorted라는 내장 함수를 제공합니다. 5개의 숫자를 순서 없이 리스트 안에 정의하고 sorted함수를 사용하여 정렬하면 (예시 21)의 결과 (1))과 같습니다. sorted함수를 사용하면 기존의 리스트에 있는 데이터 정렬에는 영향을 끼치지 않으며, sorted 함수로 인해 기존의 리스트에 있는 데이터가 일시적으로 정렬되어 출력됩니다(예시 21)의 결과 (2)). 만약, 기존의 리스트의 정렬을 아예 바꾸고 싶을 경우에는 sort라는 클래스 메소드를 사용하면 됩니다(예시 22) 참조). 

예시 21)

numbers_sorted = [1, 5, 2, 4, 3]
sorted(numbers_sorted)
numbers_sorted

결과 (1) ▷ [1, 2, 3, 4, 5]
결과 (2) ▷ [1, 5, 2, 4, 3]
예시 22)

numbers_sort = [4, 2, 5, 1, 3]
numbers_sort.sort()
numbers_sort

결과 ▷ [1, 2, 3, 4, 5]

(10) 최댓값과 최솟값 확인

내장 함수인 max함수와 min함수를 사용하여 리스트에 있는 데이터의 최댓값과 최솟값을 확인할 수도 있습니다. 리스트에 있는 데이터의 최댓값(예시 23)의 결과 (1))과 최솟값(예시 23)의 결과 (2))을 출력해보겠습니다.

예시 23)

numbers = [1, 2, 3, 4, 5]
max(numbers)
min(numbers)

결과 (1) ▷ 5
결과 (2) ▷ 1

(11) 리스트의 데이터들의 합

내장 함수인 sum함수를 사용하여 리스트에 있는 데이터들의 합을 구할 수도 있습니다(예시 24) 참조). 

예시 24)

numbers = [1, 2, 3, 4, 5]
sum(numbers)

결과 ▷ 15

○ 추가적인 리스트의 기능

또한 리스트에는 서로 다른 타입인 데이터들을 한꺼번에 삽입할 수 있습니다. 가령, string타입, int타입, float타입 등 타입이 서로 같지 않은 종류의 데이터를 하나의 리스트에 삽입할 수 있습니다. 또한 for문을 사용할 때 리스트에 정의된 데이터를 하나의 인자로 받아들여 순서대로 출력할 수도 있습니다(예시 25) 참조). 

예시 25)

alphabets = ['A', 'B', 'C', 'D', 'E']
for alphabet in alphabets :
    print(alphabet)
    
결과 ▷ A
        B
        C
        D
        E

이를 set기능을 사용하여 정의할 경우 (예시 26)과 같이 순서대로 출력이 되지 않는 것을 볼 수 있습니다. 일반적으로 list는 브라켓([ ])을 사용하여 정의하지만, set기능을 사용하려면 컬리브레이스({ })을 사용하여 정의하면 됩니다. list에 중복된 데이터를 정의할 때에는 중복된 데이터가 그대로 보존(예시 27)의 결과 (1))되는 반면에 set기능에 중복된 데이터를 정의하게 되면 중복된 데이터는 삭제되어 정의됩니다(예시 27) 결과 (2)참조).

예시 26)

alphabets_set = {'A', 'B', 'C', 'D', 'E'}
for alphabet in alphabets_set :
	print(alphabet)
    
결과 ▷ B
        A
        C
        E
        D
예시 27)

numbers_list = [1, 1, 2, 2, 3, 3]
numbers_set = {1, 1, 2, 2, 3, 3}
numbers_list
numbers_set

결과 (1) ▷ [1, 1, 2, 2, 3, 3]
결과 (2) ▷ {1, 2, 3]