들어가기전 앞서 짚고 넘어가야 할 내용
- 부울, 정수, 부동소수점수, 문자열 --> 원자(atom) 타입
- 리스트, 튜플, 딕셔너리, 셋(세트) --> 분자(molecule) 타입
- 문자열, 리스트, 튜플 --> 시퀸스 구조
- 문자열은 문자만을 시퀸스로 갖는 구조이지만, 리스트와 튜플은 다른 타입의 항목들을 시퀸스로 가질 수 있음
- 리스트: 변경가능
- 튜플: 변경 불가
리스트 생성
리스트
- 리스트는 0개 이상의 요소로 구성된 시퀸스 구조
- 변경이 가능한 데이터 타입
- 각 요소를 콤마(,)로 구분하고 대괄호([])로 둘러 싸서 표현
리스트의 생성
>>> empty_list1 =[]
>>> names = ['홍길동', '임꺽정', '전우치']
>>> complex = [1, '파이썬', True]
>>> empty_list2 = list()
empty_list2 = list() 와 같은 방법으로 빈 리스트를 만들 수 있다.
리스트로 변환
list() 함수는 다른 데이터 타입을 리스트로 변환
>>> list('list')
['l', 'i', 's', 't']
>>> t = (1,2,3)
>>> list(t)
[1, 2, 3]
문자열의 split() 함수
>>> day = '2020-3-30'
>>> day.split('-')
['2020', '3', '30']
>>> day2 = '2020--3-30'
>>> day2.split('-')
['2020', '', '3', '30']
>>> day2.split('--')
['2020', '3-30']
리스트의 리스트
리스트는 서로 다른 타입의 요소를 포함할 수 있으며, 리스트도 포함가능하다.
>>> s1 = ['20200101','홍길동' , 90, 45]
>>> s2 = ['20200102','심청이' , 94, 90]
>>> s3 = ['20200103','성춘향' , 85, 92]
>>> students = [s1,s2,s3]
>>> students
[['20200101', '홍길동', 90, 45], ['20200102', '심청이', 94, 90], ['20200103', '성춘향', 85, 92]]
>>> students[-1][1]
'성춘향'
[offset]으로 항목 얻기
문자열과 같이 리스트는 오프셋으로 특정 위치의 값을 얻을 수 있다.
>>> day = ['2020', '3', '30']
>>> day[0]
'2020'
>>> day[1]
'3'
>>> day[2]
'30'
>>> day[-1]
'30'
>>> day[-2]
'3'
>>> day[-3]
'2020'
[offset]으로 항목 바꾸기
[offset]을 이용하여 특정 위치의 항목의 값을 바꿀 수 있다.
>>> names = ['홍길동', '전우치', '임꺽정']
>>> names[0] = '임꺽정'
>>> names[-1] = '이순신'
>>> names
['임꺽정', '전우치', '이순신']
슬라이스
시퀸스 구조의 데이터 타입은 슬라이스를 사용해서 서브시퀀스 추출이 가능하다.
>>> numbers = [1,2,3,4,5,6,7,8]
>>> numbers[::2]
[1, 3, 5, 7]
>>> numbers[1::2]
[2, 4, 6, 8]
>>> numbers[::-1]
[8, 7, 6, 5, 4, 3, 2, 1]
리스트에 항목추가
append() 메소드를 사용하여 리스트의 끝에 새로운 항목을 추가
>>> names = ['홍길동' , '임꺽정', '전우치']
>>> names.append('이순신')
>>> names
['홍길동', '임꺽정', '전우치', '이순신']
오프셋(offset)과 insert()로 항목 추가
- append() 함수는 단순히 리스트의 끝에 항목을추가
- insert()함수는 특정 위치에 항목 추가가 가능
>>> names = ['홍길동' , '임꺽정', '전우치']
>>> names.append('이순신')
>>> names
['홍길동', '임꺽정', '전우치', '이순신']
>>> names.insert(1,'심청이')
>>> names
['홍길동', '심청이', '임꺽정', '전우치', '이순신']
>>> names.insert(100,'성춘향')
>>> names
['홍길동', '심청이', '임꺽정', '전우치', '이순신', '성춘향']
항목삭제
오프셋으로 항목 삭제: del
>>> numbers = [1,2,3,4,5,6]
>>> del numbers[2]
>>> numbers
[1, 2, 4, 5, 6]
값으로 항목 삭제: remove()
>>> names = ['홍길동' , '임꺽정', '전우치', '이순신']
>>> names.remove('전우치')
>>> names
['홍길동', '임꺽정', '이순신']
오프셋으로 항목을 얻은 후 삭제: pop()
>>> names = ['홍길동', '심청이', '전우치', '성춘향', '임꺽정', '이순신']
>>> names.pop(0)
'홍길동'
>>> names
['심청이', '전우치', '성춘향', '임꺽정', '이순신']
>>> names.pop(-1)
'이순신'
>>> names
['심청이', '전우치', '성춘향', '임꺽정']
>>> names.pop(2)
'성춘향'
>>> names
['심청이', '전우치', '임꺽정']
>>> names.pop()
'임꺽정'
>>> names
['심청이', '전우치']
리스트 병합
extend() 메소드를 사용하여 리스트 병합
>>> numbers1 = [1,2,3,4,5]
>>> numbers2 = [6,7,8,9,10]
>>> numbers1.extend(numbers2)
>>> numbers1
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> numbers2
[6, 7, 8, 9, 10]
+ 연산을 이용하여 리스트 병합
원본을 바꾸지 않고 새로운 변수에 결과를 넣을 수 있음.
>>> numbers1 = [1,2,3,4,5]
>>> numbers2 = [6,7,8,9,10]
>>> numbers3 = numbers1 + numbers2
>>> numbers3
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+= 연산자를 이용하여 병합
>>> numbers1 = [1,2,3,4,5]
>>> numbers2 = [6,7,8,9,10]
>>> numbers1 += numbers2
>>> numbers1
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
<op>= 형태의 대입 연산자
>>> a = 3
>>> b = 4
>>> a = a + b
>>> a
7
>>> a += b
>>> a
11
값으로 항목 오프셋 찾기
리스트 내에서 항목의 값에 해당하는 오프셋을 찾고 싶다면 index() 메소드 사용
리스트 내에 찾고자 하는 값이 없으면 오류를 출력함.
>>> names = ['홍길동', '전우치', '임꺽정', '이순신']
>>> names.index('임꺽정')
2
>>> names.index('심청이')
Traceback (most recent call last):
File "<pyshell#93>", line 1, in <module>
names.index('심청이')
ValueError: '심청이' is not in list
값의 존재 여부 확인
리스트 안에 특정 값이 있는지 여부는 in 연산자를 사용
>>> numbers = [10,20,30,40,50]
>>> 20 in numbers
True
>>> 100 in numbers
False
값 세기
리스트에 특정 값이 얼마나 있는지 세고 싶다면 count() 메서드 사용
>>> numbers = [10, 20, 30, 50, 10, 40, 60, 20]
>>> numbers.count(10)
2
>>> numbers.count(0)
0
문자열로 변환
str() 함수 사용
>>> str(numbers)
'[1, 2, 3]'
>>> names = ['홍길동', '전우치', '임꺽정']
>>> str(names)
"['홍길동', '전우치', '임꺽정']"
문자열의 join() 메서드 사용
>>> names = ['홍길동', '전우치', '임꺽정']
>>> joined = ', '.join(names)
>>> joined
'홍길동, 전우치, 임꺽정'
>>> separated = joined.split(', ')
>>> separated
['홍길동', '전우치', '임꺽정']
>>> names == separated
True
만약 항목들이 문자열로 구성되어 있지 않다면 오류가 발생한다.
>>> joined = ', '.join([1,2,3])
Traceback (most recent call last):
File "<pyshell#113>", line 1, in <module>
joined = ', '.join([1,2,3])
TypeError: sequence item 0: expected str instance, int found
정렬
파이썬은 리스트의 정렬을 위해 두개의 메서드를 제공
- sort() : 리스트 자체를 내부적으로 정렬
- sorted() : 원본 리스트의 복사본을 만들어 정렬, 원본은 정렬 안됨
정렬방법
- 기본적으로는 오름차순 정렬
- sort(reverse=True) 또는 sorted(<리스트>, reverse=True)의 형태로 사용하면 내림차순 정렬
>>> names = ['홍길동' , '임꺽정', '이순신', '전우치']
>>> sorted(names)
['이순신', '임꺽정', '전우치', '홍길동']
>>> sorted(names, reverse=True)
['홍길동', '전우치', '임꺽정', '이순신']
>>> names
['홍길동', '임꺽정', '이순신', '전우치']
>>> names.sort()
>>> names
['이순신', '임꺽정', '전우치', '홍길동']
>>> names.sort(reverse=True)
>>> names
['홍길동', '전우치', '임꺽정', '이순신']
항목 개수 얻기
len()은 시퀀스 구조를 갖는 타입의 항목의 개수를 반환
>>> scores = [100, 90, 80, 70, 60]
>>> len(scores)
할당 복사
다음과 같이 리스트를 대입연산자(=)으로 할당할 경우 같은 리스트 객체를 공유한다.
>>> a = [1,2,3]
>>> b = a
>>> b[0] = 'abc'
>>> b
['abc', 2, 3]
>>> a
['abc', 2, 3]
이때, a를 그대로 두고 싶으면, 다음과 같은 리스트 복사 메서드를 사용하면 된다.
리스트 복사
- copy() 메서드
- list() 변환함수
- 슬라이스
리스트 복사 예시
>>> a = [1,2,3]
>>> b = a.copy()
>>> c = list(a)
>>> d = a[:]
>>> b[1] = 5
>>> c[0] = 'abc'
>>> d[-1] = True
파이썬은 복사를 하지 않고 공유하는 방식을 사용하는데, 메모리가 절약되기 때문이다.
튜플
튜플
- 튜플은 리스트와 매우 유사하지만 값이 변경이 불가능하다
- 각 요소를 콤마(,)로 구분하고 괄호로 둘러 싸서 표현함, 둘러싸는 것은 생략가능하다
튜플을 아래의 예시처럼 생성할 수 있다.
>>> t1 = ()
>>> t1
()
>>> t2 = (0)
>>> t2
0
>>> t3 = 'a', 'b', 'c'
>>> t3
('a', 'b', 'c')
>>> t4 = ('a', 'b', 'c')
>>> t4
('a', 'b', 'c')
t4의 방법처럼 괄호로 덮어씌우는 것이 튜플이라는 것이 명확하게 보여 가독성 향상에 좋아 쓰는것이 좋다.
tuple() 함수
>>> t = tuple()
>>> t
()
>>> t = tuple([1,2,3])
>>> t
(1, 2, 3)
>>> t = tuple('123')
>>> t
('1', '2', '3')
튜플 언패킹
>>> t = (1,2,3,)
>>> a,b,c, = t
>>> a
1
>>> b
2
>>> c
3
튜플과 리스트
리스트와 튜플은 매우 유사
튜플은 append(), insert()등과 같이 항목의 값을 변경하는 메서드가 없음
리스트가 더 유용하지만 튜플을 사용하는 이유는 다음과 같다.
- 튜플은 더 적은 메모리 공간을 사용
- 실수로 튜플의 항목이 변경되는 것을 방지
- 튜플은 다음에 나오는 틱셔너리의 키로 사용 가능
- 네임드 튜플 (named tuple)은 객체의 단순한 대안이 될 수 있음
- 함수의 인자는 튜플로 전달
Summary
- 리스트와 튜플은 여러 타입의 항목을 저장하는 시퀀스 자료 구조이다
- 리스트는 변경 가능한 데이터 타입이며, 튜플은 변경 불가능한 자료구조이다
- list() 함수는 시퀸스 구조의 자료 구조를 리스트 타입으로 변환할 수 있다.
- tuple() 함수는 시퀸스 구조와 자료 구조를 튜플 타입으로 변환할 수 있다.
- 리스트와 튜플은 [offset] 연산을 이용하여 특정 위치의 항목에 접근할 수 있다.
- 리스트는 [offset] 연산을 이용하여 특정 위치의 항목의 값을 변경할 수 있다.
- 리스트와 튜플은 문자열처럼 슬라이스 연산을 이용하여 부분 시퀸스 추출할 수 있다.
- 리스트와 튜플의 데이터를 다루기 위한 다양한 연산자와 메서드 및 함수를 지원한다. 다만, 튜플의 경우 데이터의 값을 변경하는 기능은 지원하지 않는다.
- 리스트에 대입 연산자를 그냥 적용하면 리스트의 참조가 할당되며, 복사본을 만들기 위해서는 copy() 메서드나 list() 함수를 사용하거나 슬라이스([:]) 이용해여 대입을 하면 된다.
'Language > Python' 카테고리의 다른 글
[Python] Ch3 - part 3. 셋 (0) | 2021.03.27 |
---|---|
[Python] Ch3 - part 2. 딕셔너리 (0) | 2021.03.26 |
[Python] Ch2 - part 4. 논리 (Boolean) (0) | 2021.03.25 |
[Python] Ch2 - part 3. 문자열 (0) | 2021.03.25 |
[Python] Ch2 - part 2. 숫자 (0) | 2021.03.25 |