IT

[파이썬 기초] 자료구조(1) - 리스트

생각파워 2018. 11. 28. 17:55

파이썬은 문자열, 정수, 부울, 부동소수점과 같은 기본데이터 타입외에

기본타입들이 결합된 리스트(list), 튜플(tuple), 딕셔너리(dict) 그리고 셋(set)이라는 자료구조를 가지고 있다.

리스트부터 하나씩 살펴보자.

 

1. 생성

리스트를 생성할 때는 list() 함수와 대괄호([])를 이용해서 다음과 같이 생성할 수 있다.

>>> temp_list = list()              # list() 함수 사용
>>> type(temp_list)                 # type() 함수를 사용하면 변수의 타입을 알 수 있다.
<class 'list'>
>>> temp_list2 = []                 # [] 대괄호 사용
>>> type(temp_list2)
<class 'list'> 

 

2. 데이터 입력

append() 함수를 이용해 데이터를 입력하게 되면 그 순서를 그대로 유지하면서, 리스트의 끝에 항목을 추가한다.

insert()함수를 이용하면 인자로 주는 오프셋 위치에 항목을 추가할 수 있다.

 >>> temp_list.append('a')           # 항목 'a' 추가
>>> temp_list.append('b')           # 항목 'b' 추가
>>> temp_list
['a', 'b']                          # 첫번째 입력된 a가 처음, 두번째 입력된 b가 두번째 위치하고 있다.


>>> temp_list.insert(1,'c')         # temp_list의 1번째 위치(현재 'b')에 'c'추가
>>> temp_list
['a', 'c', 'b']                     # 'b'는 뒤로 밀려남


>>> temp_list.insert(50,'d')        # 리스트 크기보다 큰 인자를 주면 리스트 마지막에 입력. 예외발생안함.
>>> temp_list
['a', 'c', 'b', 'd']

 

3. 데이터 조회

리스트 변수명에 오프셋을 지정하면 그 위치의 데이터를 가져올 수 있다.

>>> temp_list[0]
'a'
>>> temp_list[1]
'b'

 

4. 데이터 수정

내용을 수정할 때는 오프셋을 지정하고, 항목을 할당하면 기존 데이터가 수정된다.

>>> temp_list
['a','b']
>>> temp_list[0] = 'c'              # 기존 temp_list[0] 위치에 있던 'a'를 'c'로 변경
>>> temp_list
['c', 'b'] 

 

5. 데이터 삭제

데이터를 삭제할 때는 del 명령어나 remove()함수를 이용해서 삭제한다.

del 명령어는 삭제할 데이터의 위치를 지정해주면 되고,

remove() 함수는 인자로 삭제할 데이터 값을 전달해주면 삭제된다.

temp_list 리스트에 temp_list[0] 위치에 있는 'c' 항목을 삭제해보도록 하겠다.

>>> del temp_list[0]                # del 명령어 뒤에 항목을 오프셋으로 지정하면 삭제
>>> temp_list


['b'] 


>>> temp_list.remove('c')           # remove()함수에 인자로 실제 삭제할 값을 전달해주면 삭제
>>> temp_list


['b'] 

 

6. 리스트 확장 : 다른 리스트와 합체

리스트에 다른 리스트를 합칠 수 있다.

extend()함수를 사용하면 된다.

증가 연산자인 '+='을 사용해도 동일한 효과를 얻을 수 있다.

>>> temp_list.extend(['d','e'])         # extend()를 이용한 리스트 확장
>>> temp_list
['c', 'b', 'd', 'e'] 


>>> temp_list += ['f','g']              # '+='을 이용한 리스트 확장
>>> temp_list
['c', 'b', 'd', 'e', 'f', 'g']

 

7. 다른 자료구조를 리스트로 변환

리스트를 생성할 때 사용한 list()함수를 사용하면 다른 자료구조를 리스트로 변환할 수 있다.

문자열, 튜플, 딕셔너리, 셋 등 모든 자료구조가 변경 가능하다.

한가지 주의할 점은 딕셔너리의 경우 키와 값이 존재하는데, list()함수로 변환하면 키만 리스트로 변환된다.

>>> letters = 'dongdongfather'                           
>>> l_list = list(letters)              # 문자열을 리스트로 변환
>>> l_list
['d', 'o', 'n', 'g', 'd', 'o', 'n', 'g', 'f', 'a', 't', 'h', 'e', 'r'] 


>>> tuple_data = ('a','b','c','d')
>>> type(tuple_data)                    # type()함수를 사용하면 자료형을 알 수 있다
<class 'tuple'>
>>> t_list = list(tuple_data)           # 튜플을 리스트로 변환
>>> t_list
['a', 'b', 'c', 'd']


>>> set_data = {1,3,5,7,9}
>>> type(set_data)
<class 'set'>
>>> s_list = list(set_data)             # 셋을 리스트로 변환
>>> s_list
[1, 3, 5, 7, 9]


>>> dict_data = {'a':1, 'b':2, 'c':3}
>>> d_list = list(dict_data)            # 딕셔너리의 리스트 변환
>>> d_list
['a', 'b', 'c']                         # 키만 리스트로 변환된다

 

 

7. 유용한 함수 및 명령어들

1) 항목을 가져오면서 삭제 : pop()

pop()함수는 리스트에서 항목을 가져오는 동시에 그 항목을 삭제한다.

인자를 주지 않으면 제일 오른쪽 항목을, 인자를 주면 인자의 위치에 해당하는 항목을 처리한다.

>>> temp_list
['a', 'c', 'b', 'd']
>>> temp_list.pop()                     # 인자없이 호출하면 오른쪽 마지막 항목 가져오고 삭제
'd'
>>> temp_list
['a', 'c', 'b']
>>> temp_list.pop(0)                    # 인자 0을 주면, 0번째 위치의 'a'를 가져오고 삭제
'a'
>>> temp_list
['c', 'b'] 

 

2) 값으로 오프셋 찾기 : index()

인자로 주어진 항목의 오프셋이 얼마인지 알아볼때 index()함수가 유용하다.

인자로 항목을 주면, 오프셋을 반환한다.

>>> temp_list
['c', 'b']
>>> temp_list.index('b')                # 'b'의 오프셋인 1을 반환한다.
1 

 

3) 존재여부 확인 : in

리스트에 항목이 존재하는지 알고자 할때는 in 명령어를 사용한다.

항목이 존재하면 True, 없으면 False를 리턴한다.

>>> temp_list
['c', 'b']
>>> 'c' in temp_list                   
True
>>> 'd' in temp_list
False 

 

4) 개수 세기 : count()

count()함수는 특정 항목의 개수를 알아내기 위해 사용한다.

인자로 값을 주지 않으면 예외를 발생시킨다. 

그 말은 전체 개수를 파악하는데 사용하기는 힘들다는 말이다.

그때는 len()함수를 사용하면 된다.

 

>>> temp_list
['c', 'b', 'a', 'a']
>>> temp_list.count('a')                # 'a'항목의 개수를 리턴한다.
2 


>>> temp_list.count()                   # 인자를 주지 않으면 예외를 발생시킨다.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: count() takes exactly one argument (0 given)

 

 

 

5) 문자열로 변환하기 : join()

리스트를 문자열로 변환할때는 join() 함수를 쓴다.

먼저 각 항목을 이어붙일 문자열을 적어주고, 그 문자열로 join()함수를 호출해서 리스트를 이어붙인다.

아래의 예를 보면 사용법이 명확해진다.

>>> temp_list
['c', 'b', 'a', 'a']


>>> letters = ','.join(temp_list)       # 콤마(',')를 이용해 리스트를 문자열로 이어붙인다.
>>> letters
'c,b,a,a'
>>> letters2 = '-'.join(temp_list)      # 대쉬('-')를 이용해 리스트를 문자열로 이어붙인다.
>>> letters2
'c-b-a-a'

 

6) 정렬하기 : sort(), sorted()

리스트를 정렬할 때는 두가지 함수를 쓸 수 있다.

sort()는 리스트의 메서드로서 리스트 자체를 정렬할 수 있다.

sorted() 함수는 내장함수로서 리스트를 정렬한 값을 리턴한다. 

sort()함수와 달리 sorted()함수의 인자로 주어진 리스트는 정렬되지 않는다.

>>> temp_list
['c', 'b', 'a', 'a']


>>> sorted_list = sorted(temp_list)    # temp_list를 정렬하여 sorted_list 변수에 할당한다.
>>> sorted_list                        # sorted_list는 정렬됨
['a', 'a', 'b', 'c']
>>> temp_list                          # 인자로 주어진 temp_list는 정렬되지 않음.
['c', 'b', 'a', 'a']
>>> temp_list.sort()                   # temp_list의 메서드 sort()를 호출하여 정렬
>>> temp_list
['a', 'a', 'b', 'c']                   # temp_list 정렬됨                                                     

 

7) 복사하기 : copy()

한 리스트를 두개의 변수에 할당한 후, 리스트값을 변경하면 다른 변수에 할당된 리스트로 같이 변경된다.

두 변수가 같은 주소에 있는 리스트를 참조하기 때문에 이 같은 상황이 벌어진다.

>>> temp_list
['a', 'a', 'b', 'c']
>>> temp_list2 = temp_list             # temp_list에 있는 주소를 temp_list2에 할당
>>> temp_list
['a', 'a', 'b', 'c']
>>> temp_list2
['a', 'a', 'b', 'c']
>>> temp_list2[0] = '00000'            # temp_list와 temp_list2가 같은 주소를 보고있어,
>>> temp_list2                         # 한쪽 변수를 이용해 항목을 변경하면, 다른 변수 참조값도 변경됨. 
['00000', 'a', 'b', 'c']               # 같은 리스트를 참조하고 있으니 당연한것.
>>> temp_list
['00000', 'a', 'b', 'c'] 

 

이런 상황은 이후에 큰 문제를 야기할 수 있기 때문에, 같은 리스트가 필요하다면 복사를 해서 다른 변수에 할당을 해주어야 한다.

이때 필요한 함수가 copy()이다.

>>> temp_list2 = temp_list.copy()      # temp_list를 복사하여 그 복사본을 temp_list2에 할당
>>> temp_list
['a', 'a', 'b', 'c']
>>> temp_list2                         # temp_list와 temp_list2는 같은 값을 가지지만 다른 리스트
['a', 'a', 'b', 'c']
>>> temp_list2[0] = '00000'            # temp_list2의 값을 변경해도,
>>> temp_list2
['00000', 'a', 'b', 'c']
>>> temp_list                          # temp_list의 값은 바뀌지 않음
['a', 'a', 'b', 'c']



 

 

 

 

 

 

반응형