[11, 22]
Lesson 02: 파이썬의 자료형 II (list, tuple)
list
선언
- 리스트의 선언
- 비어있는 리스트의 선언
연산
- 더하기연산
- 우리의 예상과 다른 결과가 나옴 \(\to\) 파이썬은 R처럼 자체적으로 좋은 계산기능을 내장하고 있지 않음.
- 브로드캐스팅과 같이 R에서는 당연히 가능했던 기능을 사용할 수 없음.
- 뺄셈은 정의되지 않음
- 곱하기는 정의가능
- 나눗셈은 정의되지 않음
- 더하기와 곱하기는 원소의 추가와 반복추가를 의미하지만 그렇다고 해서 뺄셈과 나눗셈이 원소의 삭제를 의미하는것은 아님
- 더하기와 곱하기가 원소의 추가와 반복추가를 의미하여 편리할때도 있긴하지만, 우리는 산술적인 +, * 를 원하는 경우도 있다. 이럴 경우는 어떻게 할 수 있을까?
(예제)
a+b = [4,6] 이 되도록 하려면?
(풀이1)
풀이가 가능한 이유? a,b는 리스트이지만 a[0], a[1], b[0], b[1] 은 각각 인트형임. 인트형은 + 연산이 가능했음.
(풀이2)
- numpy 를 이용
numpy 패키지 (파이썬의 여러 수치연산들을 담당하는 라이브러리)
- 이러한 벡터연산은 누구나 필요로 하는 연산임.
- 내가 아니더라도 누군가가 프로그램화 해놓았을 것임.
- 그 누군가가 자신이 만든 코드를 잘 정리하여 무료로 배포했을 수도 있음. (패키지를 배포한다고 표현)
- 그 패키지를 우리는 가져와서 설치한뒤 사용하기만 하면된다.
패키지를 설치하는 방법 (코랩은 이미 설치되어 있음)
!pip install numpy# 최신버전을 설치함!conda install -c conda-forge numpy -y# 안전한 버전을 설치함
설치된 패키지를 사용하는 방법
import numpy한뒤에numpy.??로 기능을 사용import numpy as np한뒤에np.??로 기능을 사용
인덱싱
- str형과 동일한 방식
리스트는 컨테이너형 객체이다.
- 리스트의 원소는 int, float 따위만 가능한 것이 아니다. (리스트는 컨테이너형 객체이므로)
각 원소의 타입을 알아보자.
- str은 컨테이너형이 아니다.
- str의 모든 원소는 문자임
리스트는 가변형 객체이다.
리스트의 원소 수정
- 리스트의 원소를 수정할 수 있다. (리스트는 가변객체이므로)
- 원소수정은 당연한 기능같은데 이것이 불가능한 경우도 있다.
(가능한경우)
(불가능한경우)
리스트의 원소 삭제
(예제)
아래와 같이 문자로 된 리스트를 선언하자.
사실 더 쉽게 선언할 수 있음
['g', 'u', 'e', 'b', 'i', 'n']
리스트의 원소 추가
(예제) 비어있는 리스트를 만들고 원소 0,1,2를 차례로 추가하여 보자.
(풀이1)
(풀이2)
- 암기법: 중복되는 변수를 지우고 연산자의 순서를 바꾼다.
(풀이3) 리스트 특화기능(=메소드)를 이용
- a+[4]와 a.append(4)의 차이점은?
(관찰1)
(관찰2)
비슷해보이지만 굉장히 미묘한 차이가 있음
a.append(4): a에 4를 append하라 \(\to\) a가 변함
a+[4]: a와 4를 연산하라
list 특수기능
(append)
Signature: a.append(object, /) Docstring: Append object to the end of the list. Type: builtin_function_or_method
(clear)
Signature: a.clear() Docstring: Remove all items from list. Type: builtin_function_or_method
(copy)
Signature: a.copy() Docstring: Return a shallow copy of the list. Type: builtin_function_or_method
(count)
Signature: a.count(value, /) Docstring: Return number of occurrences of value. Type: builtin_function_or_method
(extend)
(index)
Signature: a.index(value, start=0, stop=9223372036854775807, /) Docstring: Return first index of value. Raises ValueError if the value is not present. Type: builtin_function_or_method
(insert)
Signature: a.insert(index, object, /) Docstring: Insert object before index. Type: builtin_function_or_method
(pop)
Signature: a.pop(index=-1, /) Docstring: Remove and return item at index (default last). Raises IndexError if list is empty or index is out of range. Type: builtin_function_or_method
(remove)
Signature: a.remove(value, /) Docstring: Remove first occurrence of value. Raises ValueError if the value is not present. Type: builtin_function_or_method
(reverse)
Signature: a.reverse() Docstring: Reverse *IN PLACE*. Type: builtin_function_or_method
(sort)
Signature: a.sort(*, key=None, reverse=False) Docstring: Sort the list in ascending order and return None. The sort is in-place (i.e. the list itself is modified) and stable (i.e. the order of two equal elements is maintained). If a key function is given, apply it once to each list item and sort them, ascending or descending, according to their function values. The reverse flag can be set to sort in descending order. Type: builtin_function_or_method
(다른예제들)
중첩 리스트
- A는 아래와 같은 매트릭스로 이해할 수 있다
$
- A에서 (2,1)의 원소를 뽑고싶다 = 4를 뽑고싶다
- 실패
- 성공
- 성공의 이유를 분석해보자.
- 매트릭스는 아니지만 매트릭스 같음! - 1차원 배열을 다차원 배열로 확장할 수 있는 기본 아이디어를 제공함
tuple
리스트 vs 튜플
- 컨테이너형타입이라는 점, 그리고 연산 및 인덱싱을 하는 방법은 리스트와 같음
- 차이점1: [] 대신에 ()를 사용한다.
- 차이점2: 불변형이다. (원소의 값을 바꿀 수 없음)
- 차이점3: 하나의 원소를 선언할 때는 (1,)와 같이 해야 한다.
- 차이점4: 의미가 명확할때는 튜플의 ()를 생략가능하다.
- 컨테이너형이라는 것이 무슨의미?
- 불변형이라는 것은 무슨의미?
참고로 a를 튜플이 아니라 리스트로 선언하면 값이 잘 바뀐다.
- 하나의 원소로 이루어진 튜플을 만들때는 쉼표를 붙여야 함.
- 리스트와 중요한 차이점! 의미가 명확할때 튜플의 괄호는 생략가능하다. (이게 중요합니다)
의미가 명확할때 생략해야함
선언
- 소괄호를 이용
- 생략가능하다는 점이 포인트
- 원소가 하나인 튜플을 만들고 싶다면?
연산
- 리스트와 동일
인덱싱
- 리스트와 동일