02wk-2: 파이썬의 자료형 (3)

Author

최규빈

Published

March 15, 2023

강의영상

https://youtube.com/playlist?list=PLQqh36zP38-yYY4_T4ZDcUeMLxFJma2B3

list 기본내용

선언

- 리스트의 선언

a= [1,2,3,22] 

- 비어있는 리스트의 선언

a= []
a
[]
a= list()
a
[]

연산

- 더하기연산

[1,2]+[-3,4,5]
[1, 2, -3, 4, 5]
  • 우리의 예상과 다른 결과가 나옴 \(\to\) 파이썬은 R처럼 자체적으로 좋은 계산기능을 내장하고 있지 않음.

- 브로드캐스팅과 같이 R에서는 당연히 가능했던 기능을 사용할 수 없음.

[1,2,3,4,5] + 1
TypeError: can only concatenate list (not "int") to list

- 뺄셈은 정의되지 않음

a= [1,2,1,2]
a-[1,2]
TypeError: unsupported operand type(s) for -: 'list' and 'list'

- 곱하기는 정의가능

[1,2]*3
[1, 2, 1, 2, 1, 2]

- 나눗셈은 정의되지 않음

[1,2,1,2,1,2] /3
TypeError: unsupported operand type(s) for /: 'list' and 'int'

- 더하기와 곱하기는 원소의 추가와 반복추가를 의미하지만 그렇다고 해서 뺄셈과 나눗셈이 원소의 삭제를 의미하는것은 아님

- 더하기와 곱하기가 원소의 추가와 반복추가를 의미하여 편리할때도 있긴하지만, 우리는 산술적인 +, * 를 원하는 경우도 있다. 이럴 경우는 어떻게 할 수 있을까?

(예제)

a=[1,2]
b=[3,4]

a+b = [4,6] 이 되도록 하려면?

(풀이1)

[a[0]+b[0],a[1]+b[1]]
[4, 6]

풀이가 가능한 이유? 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
array([4, 6])

여러가지 연산 가능 (마치 R처럼 쓸 수 있음)

2*aa
array([2, 4])
2*aa+1
array([3, 5])
2*aa+1+bb
array([6, 9])

(풀이3)

import numpy as np ## 설치한 numpy라는 패키지를 쓰겠음. 그런데 numpy말고 np라는 이름으로 쓰겠음
np.array(a)+np.array(b)
array([4, 6])

인덱싱

- str형과 동일한 방식

a=[11,22,33,44,55] # 0 -4 -3 -2 -1
a[-2:] # 끝의 2개의 원소를 뽑음 
[44, 55]

list 고급내용 1

콘테이너형 객체

- 리스트의 원소는 int, float 따위만 가능한 것이 아니다. (리스트는 컨테이너형 객체이므로)

lst = [1,3.14,True,'a',[1,2], 
       (1,2),{'name':'iu','age':27},{1,2,3}]
lst
[1, 3.14, True, 'a', [1, 2], (1, 2), {'name': 'iu', 'age': 27}, {1, 2, 3}]

각 원소의 타입을 알아보자.

type(lst[0])
int
type(lst[1])
float
type(lst[2])
bool
type(lst[3])
str
type(lst[4])
list
type(lst[5])
tuple
type(lst[6])
dict
type(lst[7])
set

- str은 컨테이너형이 아니다.

'abcd'[2]
'c'
  • str의 모든 원소는 문자임

가변객체

- 리스트는 원소를 수정할 수 있다. (리스트는 가변객체이므로)

a=[11,22,33]
a
[11, 22, 33]
a[0]
11
a[0]=111
a
[111, 22, 33]

- 원소수정은 당연한 기능같은데 이것이 불가능한 경우도 있다.

(가능한경우)

a=['g','u','e','b','i','n']
a
['g', 'u', 'e', 'b', 'i', 'n']
a[0]
'g'
a[0]='G'
a
['G', 'u', 'e', 'b', 'i', 'n']

(불가능한경우)

a='guebin'
a
'guebin'
a[0]
'g'
a[0]='G'
TypeError: 'str' object does not support item assignment

리스트의 원소 삭제

(예제1) del을 이용한 원소삭제

아래와 같이 문자로 된 리스트를 선언하자.

a=['g','u','e','b','i','n']
a
['g', 'u', 'e', 'b', 'i', 'n']

사실 더 쉽게 선언할 수 있음

list('guebin')
['g', 'u', 'e', 'b', 'i', 'n']

첫번째 원소를 삭제하고 싶다면?

del a[0]
a
['u', 'e', 'b', 'i', 'n']

이 상태에서 다시 첫번째 원소를 삭제한다면?

del a[0]
a
['e', 'b', 'i', 'n']

(예제2) pop을 이용한 원소삭제

a=list('guebin')
a
['g', 'u', 'e', 'b', 'i', 'n']
a.pop(0)
'g'
a
['u', 'e', 'b', 'i', 'n']
a.pop(0)
'u'
a
['e', 'b', 'i', 'n']

HW 0315

1. 길이가 0인 리스트를 만들어라. (비어있는 리스트를 만들어라)

(풀이1)

[]
[]

(풀이2)

list()
[]

2. 다음의 실행값 중 가장 큰 숫자가 나오는 보기를 골라라. (에러가 나는 코드는 정답에서 제외함)

(a) len(3.14) 
(b) len([3.14]) 
(c) len('3.14') 

(풀이)

len(3.14)
TypeError: object of type 'float' has no len()
len([3.14])
1
len('3.14')
4

따라서 답은 (c)

3. 아래의 예제를 관찰하라.

'제 이름은 {}입니다'.format('최규빈')
'제 이름은 최규빈입니다'
'제 이름은 {}이고 사는곳은 {}입니다.'.format('최규빈','전주')
'제 이름은 최규빈이고 사는곳은 전주입니다.'

이 예제를 바탕으로 문자열에 포함된 .format()함수의 기능을 유추하라. 그리고 아래의 결과를 확인하라.

string = '전북대학교 학생엠티가 {}{}일-{}{}일 완주 곶감펜션에서 있다고 합니다. 자세한 일정 등은 다시 공지하겠습니다.' 
string.format(3,24,3,25)

ChatGPT를 활용하여 .format()함수의 기능을 학습하라.

(풀이)

생략

4. 아래의 예제를 관찰하라.

'abcdefg'.replace('g','u')
'abcdefu'

이 예제를 바탕으로 문자열의 .replace() 기능을 유추하라. 유추한 기능을 chatGPT로 확인하라.

(풀이)

생략

5. 리스트자료형의 +* 연산을 이용하여 아래와 같은 list를 생성하라.

[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5]
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5]

hint: 아래의 코드를 관찰해보세요

[1]*1+[2]*2 
[1, 2, 2]

(풀이)

[1]*1+[2]*2+[3]*3+[4]*4+[5]*5
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5]

6. 넘파이를 이용하여 아래와 같은 결과가 나오도록 코드가 작성하라.

\[\begin{bmatrix} 1 \\ 2 \end{bmatrix} + \begin{bmatrix} 11 \\ 22 \end{bmatrix} = \begin{bmatrix} 12 \\ 24 \end{bmatrix}\]

(풀이)

import numpy as np
np.array([1,2]) + np.array([11,22]) # 풀이1
array([12, 24])
np.array([[1],[2]]) + np.array([[11],[22]]) # 풀이2
array([[12],
       [24]])

풀이1,2 모두 좋음

7. 아래와 같은 벡터 \({\boldsymbol a}\)가 있다고 하자.

\[\boldsymbol{a}= \begin{bmatrix} 12 \\ 24 \end{bmatrix}\]

넘파이를 이용하여 아래의 결과가 나오게 하는 코드를 작성하라.

\[2\boldsymbol{a}= \begin{bmatrix} 24 \\ 48 \end{bmatrix}\]

(풀이)

2*np.array([12,24]) # 풀이1
array([24, 48])
2*np.array([[12],[24]]) # 풀이2
array([[24],
       [48]])