(2주차) 3월14일
리스트 - 선언, 연산, 컨테이너형 객체, 가변객체, 메소드, 중첩리스트, 컴프리헨션
-
(1/8) 리스트의 선언 및 연산 (1)
-
(2/8) 리스트의 선언 및 연산 (2) ; 넘파이패키지
-
(3/8) 컨테이너형객체, 가변객체
-
(4/8) 리스트자료형의 메소드
-
(5/8) 중첩리스트; for문 (1)
-
(6/8) for문 (2)
-
(7/8) 리스트컴프리헨션
-
(8/8) 숙제설명
-
리스트의 선언
a=[11,22]
a
type(a)
-
비어있는 리스트의 선언
a=[] # 방법1
a
a=list() # 방법2
a
-
더하기연산
a=[11,12]
b=[12,13]
a
b
a+b
- 우리의 예상과 다른 결과가 나옴 $\to$ 파이썬은 R처럼 자체적으로 좋은 계산기능을 내장하고 있지 않음.
-
브로드캐스팅과 같이 R에서는 당연히 가능했던 기능을 사용할 수 없음.
a=[1,2,3]
b=1
a+b
-
뺄셈은 정의되지 않음
a=[1,2]
b=[1,2]
a-b
-
곱하기는 정의가능
a=[1,2]
2*a # a+a
-
나눗셈은 정의되지 않음
a=[1,2,1,2]
a/2
-
더하기와 곱하기는 원소의 추가와 반복추가를 의미하지만 그렇다고 해서 뺄셈과 나눗셈이 원소의 삭제를 의미하는것은 아님
a=[1,2,3]
a-[3] # 이런건 없다
a=[1,2,1,2,1,2]
a/3 # 이런건 없다
-
더하기와 곱하기가 원소의 추가와 반복추가를 의미하여 편리할때도 있긴하지만, 우리는 산술적인 +
, *
를 원하는 경우도 있다. 이럴 경우는 어떻게 할 수 있을까?
(예제)
a=[1,2]
b=[3,4]
a+b = [4,6] 이 되도록 하려면?
(풀이1)
a[0]+b[0] # a의 첫번째 원소를 추출, b의 첫번째 원소를 추출, 둘을 더함
a[1]+b[1] # a의 두번째 원소를 추출, b의 두번째 원소를 추출, 둘을 더함
[a[0]+b[0],a[1]+b[1]]
풀이가 가능한 이유? a,b는 리스트이지만 a[0], a[1], b[0], b[1] 은 각각 인트형임. 인트형은 + 연산이 가능했음.
(풀이2)
numpy 패키지 (파이썬의 여러 수치연산들을 담당하는 라이브러리)
- 이러한 벡터연산은 누구나 필요로 하는 연산임.
- 내가 아니더라도 누군가가 프로그램화 해놓았을 것임.
- 그 누군가가 자신이 만든 코드를 잘 정리하여 무료로 배포했을 수도 있음. (패키지를 배포한다고 표현)
- 그 패키지를 우리는 가져와서 설치한뒤 사용하기만 하면된다.
패키지를 설치하는 방법
-
!pip install numpy
# 최신버전을 설치함 -
!conda install -c conda-forge numpy -y
# 안전한 버전을 설치함
설치된 패키지를 사용하는 방법
-
import numpy
한뒤에numpy.??
로 기능을 사용 -
import numpy as np
한뒤에np.??
로 기능을 사용
import numpy ## 설치한패키지를 쓰겠다고 선언함
a=[1,2]
b=[3,4]
aa=numpy.array(a)
bb=numpy.array(b)
# aa,bb는 리스트가 아니라 넘파이 어레이,
# numpy.array()는 numpy패키지에서 제공하는 array함수를 쓰겠다는 의미.
aa+bb
이런것도 가능
2*aa
2*aa+1
2*aa+1+bb
(풀이3)
import numpy as np ## 설치한 numpy라는 패키지를 쓰겠음. 그런데 numpy말고 np라는 이름으로 쓰겠음
a=[1,2]
b=[3,4]
np.array(a)+np.array(b)
-
str형과 동일한 방식
a=[11,22,33,44,55] # 0 -4 -3 -2 -1
a[-2:] # 끝의 2개의 원소를 뽑음
-
리스트의 원소는 int, float 따위만 가능한 것이 아니다. (리스트는 컨테이너형 객체이므로)
lst = [1,3.14,True,'a',[1,2],
(1,2),{'name':'iu','age':27},{1,2,3}]
lst
각 원소의 타입을 알아보자.
type(lst[0])
type(lst[1])
type(lst[2])
type(lst[3])
type(lst[4])
type(lst[5])
type(lst[6])
type(lst[7])
-
str은 컨테이너형이 아니다.
'abcd'[2]
- str의 모든 원소는 문자임
-
리스트의 원소를 수정할 수 있다. (리스트는 가변객체이므로)
a=[11,22,33]
a
a[0]
a[0]=111
a
-
원소수정은 당연한 기능같은데 이것이 불가능한 경우도 있다.
(가능한경우)
a=['g','u','e','b','i','n']
a
a[0]
a[0]='G'
a
(불가능한경우)
a='guebin'
a
a[0]
a[0]='G'
-
리스트 원소 삭제
(예제)
아래와 같이 문자로 된 리스트를 선언하자.
a=['g','u','e','b','i','n']
a
사실 더 쉽게 선언할 수 있음
a= 'guebin' # string으로 a를 선언
a= list(a) # list(a)를 통하여 str을 ㅣist로 변환 -> 그 결과를 a에 다시 저장
a
첫번째 원소를 삭제하고 싶다면?
del a[0]
a
이 상태에서 다시 첫번쨰 원소를 삭제한다면?
del a[0]
a
-
리스트의 원소 추가
(예제) 비어있는 리스트를 만들고 원소 0,1,2를 차례로 추가하여 보자.
(풀이1)
a=[]
a
a= a + [0]
a
a= a + [1]
a
a= a + [2]
a
(풀이2)
a=[]
a
a += [0]
a
a += [1]
a
a += [2]
a
- 암기법: 중복되는 변수를 지우고 연산자의 순서를 바꾼다.
(풀이3) 리스트 특화기능(=메소드)를 이용
a=[]
a
a.append(0)
a
a.append(1)
a
a.append(2)
a
-
a+[4]
와 a.append(4)
의 차이점은?
(관찰1)
a=[1,2,3]
a+[4] ## 리스트 a와 리스트 [4]의 연산결과를 알려줘
a ## a는 그대로임. 변화없음
(관찰2)
a=[1,2,3]
a.append(4)
a ## a자체가 변화함
비슷해보이지만 굉장히 미묘한 차이가 있음
a.append(4)
: a
에 4를 append하라 $\to$ a
가 변함
a+[4]
: a
와 4를 연산하라
(append)
a=[1,2,3,4]
a.append?
a.append(5)
a
(clear)
a=[1,2,3,4]
a.clear?
a.clear()
a
(copy)
a=[1,2,3,4]
a.copy?
b=a.copy()
b
(count)
a=[1,1,2,3,3,4,4,4]
a.count?
a.count(1)
a.count(2)
a.count(3)
a.count(4)
(extend)
a=[1,2,3,4]
b=[-1,-2,-3,-4]
a.extend(b)
a
a=[1,2,3,4]
b=[-1,-2,-3,-4]
a.append(b)
a
(index)
a=[11,22,'a',True, 22,'a']
a.index?
a.index(11)
a.index(22)
a.index('a')
a.index(True)
(insert)
a=[1,2,3]
a.insert?
a.insert(1,88)
a
(pop)
a=['a',1,2,'d']
a.pop?
a.pop() # index=-1 이므로 마지막원소가 나타남
a # a는 마지막 원소가 사라진 상태
a.pop(0) # index=0 이므로 첫번쨰 원소가 나타남
a # a에는 첫번째 원소가 사라진 상태
(remove)
a=['a',2,3,'d']
a.remove?
a.remove('d')
a
a.remove('a')
a
(reverse)
a=[1,2,3,4]
a.reverse?
a.reverse()
a
(sort)
a=[1,3,2,4]
a.sort?
a.sort()
a
(다른예제들)
a=list('guebin')
a
a.sort()
a
a.sort(reverse=True)
a
A=[[1,2,3],[4,5,6],[7,8,9]]
A
-
A는 아래와 같은 매트릭스로 이해할 수 있다
$ \bf{A}=\begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{bmatrix} $
-
A에서 (2,1)의 원소를 뽑고싶다 = 4를 뽑고싶다
A[1,0]
- 실패
A[1][0]
- 성공
-
성공의 이유를 분석해보자.
A
A[1]
A[1][0]
-
매트릭스는 아니지만 매트릭스 같음!
- 1차원 배열을 다차원 배열로 확장할 수 있는 기본 아이디어를 제공함
-
리스트 컴프리헨션을 이해하기 전에 for문에 대하여 알아보자.
[예비학습] for
문 벼락치기
프로그램안에서 반복해서 무엇인가를 하고싶다 $\to$ for
for i in [0,1,2,3]: ## 반복실행계획
print(i) ## 반복실행할내용, 탭을이용하여 들여쓰기해야한다.
(예제) 1,2,3,4의 합을 for문을 이용하여 구해보자.
_sum = 0
for i in [1,2,3,4]:
_sum = _sum + i
_sum
_sum = 0
i=1
_sum = _sum + i ## 1 <= 0+1
i=2
_sum = _sum + i ## 3 <= 1+2
i=3
_sum = _sum + i ## 6 <= 3+3
i=4
_sum = _sum + i ## 10 <= 6+4
_sum
예비학습끝
-
예제: $2^0, 2^1, 2^2, 2^3$를 원소로 가지는 리스트를 생성하라.
(풀이1) 직접입력
x= [2**0, 2**1, 2**2, 2**3]
x
(풀이2) for문을 이용함
x=[]
for i in [0,1,2,3]:
x.append(2**i)
x
(풀이3) for문을 이용함
x=[]
for i in [0,1,2,3]:
x = x+[2**i]
x
(풀이4) for문을 이용함
x=[]
for i in [0,1,2,3]:
x += [2**i]
x
(풀이5) 리스트컴프리헨션을 이용한 풀이
x= [2**i for i in [0,1,2,3]]
x
-
리스트컴프리헨션의 문법 암기방법
- 집합에서 조건제시법을 연상
- $\{2^0,2^1,2^2,2^3\}=\{2^i: i \in \{0,1,2,3\} \}$
-
리스트컴프리헨션이란?
- 리스트를 매우 효율적으로 만드는 테크닉
- for문에 비하여 가지고 있는 장점: (1) 코드가 간결하다 (2) 빠르다
-
예제: 리스트 컴프리헨션을 이용하여 아래와 같은 리스트를 만들어라.
['SSSS','PPPP','AAAA','MMMM']
(풀이)
[i*4 for i in 'SPAM']
-
예제: 리스트컴프리헨션을 이용하여 아래와 같은 리스트를 만들어라.
['X1','X2','X3','Y1','Y2','Y3']
(풀이)
[i+j for i in 'XY' for j in '123']
-
예제: 리스트컴프리헨션을 이용하여 통계1,...,통계5,수학1,...,수학5를 만들어라.
(풀이)
[x+y for x in ['stat','math'] for y in '12345']
- $\{xy : x \in \{stat,math\}, y \in \{1,2,3,4,5\} \}$
(다른풀이) 참고로 for문을 쓰면 좀 복잡해진다.
_lst = []
for x in ['stat','math']:
for y in '12345':
_lst = _lst + [x+y]
_lst
-
예제: 'jbnu'를 이용하여 아래와 같은 리스트를 만들어라. (리스트컴프리헨션을 이용할것)
['j','b','n','u']
(다른풀이) 아래와 같이 풀면 된다는것은 알고 있음
list('jbnu')
(풀이)
[x for x in 'jbnu']
-
예제: x에는 무엇이 있을까?
(경우1)
x=1
lst = []
for x in 'jbnu':
lst = lst + [x]
lst
x
(경우2)
x=1
lst = [x for x in 'jbnu']
lst
x
- 진짜 미묘하게 다르죠?
-
예제: [X1,X2,X3,...,X100]와 같은 리스트를 만들어보라.
(풀이)
['X'+str(i) for i in [1,2,3,4]] ## 이걸 4까지가 아니라 100까지 써야함
['X'+str(i) for i in 1:100]
[예비학습]
range(0,10)
- 이게뭐야?
_tmp = range(0,10)
_tmp?
- 우리가 아는 범위에서는 모르겠음.. 이런게 있나보다 하고 넘어가야 하겠음
list(range(0,10)) # 0을 포함, 10을 미포함
- 이게 중요한것임. range(0,10)를 리스트화시키면 [0,1,2,...,9] 와 같은 리스트를 얻을 수 있음.
list(range(10)) # 0은 생략가능
list(range(2,10)) # 2는 포함, 10은 미포함
list(range(1,10,2)) # 2는 포함, 10은 미포함
예비학습 끝
['X'+str(i) for i in list(range(1,13))] ## 출력결과가 너무 기니까 101대신에 13으로 변경
(아래와 같은 풀이도 가능)
['X'+str(i) for i in range(1,13)] ## 출력결과가 너무 기니까 101대신에 13으로 변경
(딴생각) 생각해보니까 for문 뒤에 올수 있는것이 무엇인지 생각하는것도 흥미로울듯
for i in '1234':
print(i)
for i in [1,2,3,4]:
print(i)
for i in (1,2,3,4): # (1,2,3,4)는 튜플
print(i)
for i in {1,2,3,4}: # {1,2,3,4}는 set
print(i)
for i in {'name':'iu','age':28}: #{'name':'iu','age':28} 는 딕셔너리
print(i)
for i in range(1,5):
print(i)
(숙제)
리스트컴프리헨션을 이용하여 아래와 같은 리스트를 만들어라.
['X1','X2X2','X3X3X3','X4X4X4X4','X5X5X5X5X5']