강의영상

- (1/8) 리스트의 선언 및 연산 (1)

- (2/8) 리스트의 선언 및 연산 (2) ; 넘파이패키지

- (3/8) 컨테이너형객체, 가변객체

- (4/8) 리스트자료형의 메소드

- (5/8) 중첩리스트; for문 (1)

- (6/8) for문 (2)

- (7/8) 리스트컴프리헨션

- (8/8) 숙제설명

list

선언

- 리스트의 선언

a=[11,22]
a
[11, 22]
type(a)
list

- 비어있는 리스트의 선언

a=[] # 방법1
a
[]
a=list() # 방법2
a
[]

연산

- 더하기연산

a=[11,12]
b=[12,13]
a
[11, 12]
b
[12, 13]
a+b
[11, 12, 12, 13]
  • 우리의 예상과 다른 결과가 나옴 $\to$ 파이썬은 R처럼 자체적으로 좋은 계산기능을 내장하고 있지 않음.

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

a=[1,2,3]
b=1
a+b
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Input In [9], in <module>
      1 a=[1,2,3]
      2 b=1
----> 3 a+b

TypeError: can only concatenate list (not "int") to list

- 뺄셈은 정의되지 않음

a=[1,2]
b=[1,2]
a-b
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Input In [10], in <module>
      1 a=[1,2]
      2 b=[1,2]
----> 3 a-b

TypeError: unsupported operand type(s) for -: 'list' and 'list'

- 곱하기는 정의가능

a=[1,2]
2*a # a+a 
[1, 2, 1, 2]

- 나눗셈은 정의되지 않음

a=[1,2,1,2]
a/2
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Input In [13], in <module>
      1 a=[1,2,1,2]
----> 2 a/2

TypeError: unsupported operand type(s) for /: 'list' and 'int'

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

a=[1,2,3]
a-[3] # 이런건 없다
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Input In [14], in <module>
      1 a=[1,2,3]
----> 2 a-[3]

TypeError: unsupported operand type(s) for -: 'list' and 'list'
a=[1,2,1,2,1,2]
a/3 # 이런건 없다
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Input In [15], in <module>
      1 a=[1,2,1,2,1,2]
----> 2 a/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의 첫번째 원소를 추출, b의 첫번째 원소를 추출, 둘을 더함 
4
a[1]+b[1] # a의 두번째 원소를 추출, b의 두번째 원소를 추출, 둘을 더함 
6
[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는 리스트가 아니라 넘파이 어레이,
# numpy.array()는 numpy패키지에서 제공하는 array함수를 쓰겠다는 의미. 
aa+bb
array([4, 6])

이런것도 가능

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라는 이름으로 쓰겠음
a=[1,2]
b=[3,4]
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 고급

콘테이너형 객체, 가변객체

- 리스트의 원소는 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                                 Traceback (most recent call last)
Input In [109], in <module>
----> 1 a[0]='G'

TypeError: 'str' object does not support item assignment

- 리스트 원소 삭제

(예제)

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

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

사실 더 쉽게 선언할 수 있음

a= 'guebin' # string으로 a를 선언
a= list(a) # list(a)를 통하여 str을 ㅣist로 변환 -> 그 결과를 a에 다시 저장
a
['g', 'u', 'e', 'b', 'i', 'n']

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

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

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

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

- 리스트의 원소 추가

(예제) 비어있는 리스트를 만들고 원소 0,1,2를 차례로 추가하여 보자.

(풀이1)

a=[]
a
[]
a= a + [0] 
a
[0]
a= a + [1]
a
[0, 1]
a= a + [2]
a
[0, 1, 2]

(풀이2)

a=[]
a
[]
a += [0] 
a
[0]
a += [1]
a
[0, 1]
a += [2]
a
[0, 1, 2]
  • 암기법: 중복되는 변수를 지우고 연산자의 순서를 바꾼다.

(풀이3) 리스트 특화기능(=메소드)를 이용

a=[]
a
[]
a.append(0)
a
[0]
a.append(1)
a
[0, 1]
a.append(2)
a
[0, 1, 2]

- a+[4]a.append(4)의 차이점은?

(관찰1)

a=[1,2,3]
a+[4] ## 리스트 a와 리스트 [4]의 연산결과를 알려줘 
[1, 2, 3, 4]
a ## a는 그대로임. 변화없음 
[1, 2, 3]

(관찰2)

a=[1,2,3]
a.append(4)
a ## a자체가 변화함 
[1, 2, 3, 4]

비슷해보이지만 굉장히 미묘한 차이가 있음

a.append(4): a에 4를 append하라 $\to$ a가 변함

a+[4]: a와 4를 연산하라

메소드 (리스트 자료형에 특화된 특수한 함수들)

(append)

a=[1,2,3,4]
a.append?
Signature: a.append(object, /)
Docstring: Append object to the end of the list.
Type:      builtin_function_or_method
a.append(5)
a
[1, 2, 3, 4, 5]

(clear)

a=[1,2,3,4]
a.clear?
Signature: a.clear()
Docstring: Remove all items from list.
Type:      builtin_function_or_method
a.clear()
a
[]

(copy)

a=[1,2,3,4]
a.copy?
Signature: a.copy()
Docstring: Return a shallow copy of the list.
Type:      builtin_function_or_method
b=a.copy()
b
[1, 2, 3, 4]

(count)

a=[1,1,2,3,3,4,4,4]
a.count?
Signature: a.count(value, /)
Docstring: Return number of occurrences of value.
Type:      builtin_function_or_method
a.count(1)
2
a.count(2)
1
a.count(3)
2
a.count(4)
3

(extend)

a=[1,2,3,4]
b=[-1,-2,-3,-4]
a.extend(b)
a
[1, 2, 3, 4, -1, -2, -3, -4]
a=[1,2,3,4]
b=[-1,-2,-3,-4]
a.append(b)
a
[1, 2, 3, 4, [-1, -2, -3, -4]]

(index)

a=[11,22,'a',True, 22,'a']
a.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
a.index(11)
0
a.index(22)
1
a.index('a')
2
a.index(True)
3

(insert)

a=[1,2,3]
a.insert?
Signature: a.insert(index, object, /)
Docstring: Insert object before index.
Type:      builtin_function_or_method
a.insert(1,88) 
a
[1, 88, 2, 3]

(pop)

a=['a',1,2,'d']
a.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
a.pop() # index=-1 이므로 마지막원소가 나타남
'd'
a # a는 마지막 원소가 사라진 상태
['a', 1, 2]
a.pop(0) # index=0 이므로 첫번쨰 원소가 나타남
'a'
a # a에는 첫번째 원소가 사라진 상태
[1, 2]

(remove)

a=['a',2,3,'d']
a.remove?
Signature: a.remove(value, /)
Docstring:
Remove first occurrence of value.

Raises ValueError if the value is not present.
Type:      builtin_function_or_method
a.remove('d')
a
['a', 2, 3]
a.remove('a')
a
[2, 3]

(reverse)

a=[1,2,3,4]
a.reverse?
Signature: a.reverse()
Docstring: Reverse *IN PLACE*.
Type:      builtin_function_or_method
a.reverse()
a
[4, 3, 2, 1]

(sort)

a=[1,3,2,4]
a.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.sort()
a
[1, 2, 3, 4]

(다른예제들)

a=list('guebin')
a
['g', 'u', 'e', 'b', 'i', 'n']
a.sort()
a
['b', 'e', 'g', 'i', 'n', 'u']
a.sort(reverse=True)
a
['u', 'n', 'i', 'g', 'e', 'b']

중첩리스트

A=[[1,2,3],[4,5,6],[7,8,9]]
A
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

- A는 아래와 같은 매트릭스로 이해할 수 있다

$ \bf{A}=\begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{bmatrix} $

- A에서 (2,1)의 원소를 뽑고싶다 = 4를 뽑고싶다

A[1,0]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Input In [279], in <module>
----> 1 A[1,0]

TypeError: list indices must be integers or slices, not tuple
  • 실패
A[1][0]
4
  • 성공

- 성공의 이유를 분석해보자.

A
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
A[1]
[4, 5, 6]
A[1][0]
4

- 매트릭스는 아니지만 매트릭스 같음!

  • 1차원 배열을 다차원 배열로 확장할 수 있는 기본 아이디어를 제공함

리스트컴프리헨션($\star\star\star$)

- 리스트 컴프리헨션을 이해하기 전에 for문에 대하여 알아보자.

[예비학습] for문 벼락치기

프로그램안에서 반복해서 무엇인가를 하고싶다 $\to$ for

for i in [0,1,2,3]: ## 반복실행계획
    print(i) ## 반복실행할내용, 탭을이용하여 들여쓰기해야한다. 
0
1
2
3

(예제) 1,2,3,4의 합을 for문을 이용하여 구해보자.

_sum = 0
for i in [1,2,3,4]: 
    _sum = _sum + i 
_sum
10
_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
10

예비학습끝

- 예제: $2^0, 2^1, 2^2, 2^3$를 원소로 가지는 리스트를 생성하라.

(풀이1) 직접입력

x= [2**0, 2**1, 2**2, 2**3] 
x
[1, 2, 4, 8]

(풀이2) for문을 이용함

x=[] 
for i in [0,1,2,3]:
    x.append(2**i) 
x
[1, 2, 4, 8]

(풀이3) for문을 이용함

x=[] 
for i in [0,1,2,3]:
    x = x+[2**i]
x
[1, 2, 4, 8]

(풀이4) for문을 이용함

x=[] 
for i in [0,1,2,3]:
    x += [2**i]
x
[1, 2, 4, 8]

(풀이5) 리스트컴프리헨션을 이용한 풀이

x= [2**i for i in [0,1,2,3]] 
x
[1, 2, 4, 8]

- 리스트컴프리헨션의 문법 암기방법

  • 집합에서 조건제시법을 연상
  • $\{2^0,2^1,2^2,2^3\}=\{2^i: i \in \{0,1,2,3\} \}$

- 리스트컴프리헨션이란?

  • 리스트를 매우 효율적으로 만드는 테크닉
  • for문에 비하여 가지고 있는 장점: (1) 코드가 간결하다 (2) 빠르다

- 예제: 리스트 컴프리헨션을 이용하여 아래와 같은 리스트를 만들어라.

['SSSS','PPPP','AAAA','MMMM']
['SSSS', 'PPPP', 'AAAA', 'MMMM']

(풀이)

[i*4 for i in 'SPAM']
['SSSS', 'PPPP', 'AAAA', 'MMMM']

- 예제: 리스트컴프리헨션을 이용하여 아래와 같은 리스트를 만들어라.

['X1','X2','X3','Y1','Y2','Y3']
['X1', 'X2', 'X3', 'Y1', 'Y2', 'Y3']

(풀이)

[i+j for i in 'XY' for j in '123']
['X1', 'X2', 'X3', 'Y1', 'Y2', 'Y3']

- 예제: 리스트컴프리헨션을 이용하여 통계1,...,통계5,수학1,...,수학5를 만들어라.

(풀이)

[x+y for x in ['stat','math'] for y in '12345'] 
['stat1',
 'stat2',
 'stat3',
 'stat4',
 'stat5',
 'math1',
 'math2',
 'math3',
 'math4',
 'math5']
  • $\{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 
['stat1',
 'stat2',
 'stat3',
 'stat4',
 'stat5',
 'math1',
 'math2',
 'math3',
 'math4',
 'math5']

- 예제: 'jbnu'를 이용하여 아래와 같은 리스트를 만들어라. (리스트컴프리헨션을 이용할것)

['j','b','n','u']
['j', 'b', 'n', 'u']

(다른풀이) 아래와 같이 풀면 된다는것은 알고 있음

list('jbnu')
['j', 'b', 'n', 'u']

(풀이)

[x for x in 'jbnu']
['j', 'b', 'n', 'u']

- 예제: x에는 무엇이 있을까?

(경우1)

x=1 
lst = [] 
for x in 'jbnu': 
    lst = lst + [x]
lst    
['j', 'b', 'n', 'u']
x 
'u'

(경우2)

x=1 
lst = [x for x in 'jbnu'] 
lst 
['j', 'b', 'n', 'u']
x
1
  • 진짜 미묘하게 다르죠?

- 예제: [X1,X2,X3,...,X100]와 같은 리스트를 만들어보라.

(풀이)

['X'+str(i) for i in [1,2,3,4]] ## 이걸 4까지가 아니라 100까지 써야함
['X1', 'X2', 'X3', 'X4']
['X'+str(i) for i in 1:100]
  Input In [432]
    ['X'+str(i) for i in 1:100]
                          ^
SyntaxError: invalid syntax

[예비학습]

range(0,10)
range(0, 10)
  • 이게뭐야?
_tmp = range(0,10)
_tmp?
Type:        range
String form: range(0, 10)
Length:      10
Docstring:  
range(stop) -> range object
range(start, stop[, step]) -> range object

Return an object that produces a sequence of integers from start (inclusive)
to stop (exclusive) by step.  range(i, j) produces i, i+1, i+2, ..., j-1.
start defaults to 0, and stop is omitted!  range(4) produces 0, 1, 2, 3.
These are exactly the valid indices for a list of 4 elements.
When step is given, it specifies the increment (or decrement).
  • 우리가 아는 범위에서는 모르겠음.. 이런게 있나보다 하고 넘어가야 하겠음
list(range(0,10)) # 0을 포함, 10을 미포함 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  • 이게 중요한것임. range(0,10)를 리스트화시키면 [0,1,2,...,9] 와 같은 리스트를 얻을 수 있음.
list(range(10)) # 0은 생략가능
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
list(range(2,10)) # 2는 포함, 10은 미포함 
[2, 3, 4, 5, 6, 7, 8, 9]
list(range(1,10,2)) # 2는 포함, 10은 미포함 
[1, 3, 5, 7, 9]

예비학습 끝

['X'+str(i) for i in list(range(1,13))] ## 출력결과가 너무 기니까 101대신에 13으로 변경 
['X1', 'X2', 'X3', 'X4', 'X5', 'X6', 'X7', 'X8', 'X9', 'X10', 'X11', 'X12']

(아래와 같은 풀이도 가능)

['X'+str(i) for i in range(1,13)] ## 출력결과가 너무 기니까 101대신에 13으로 변경 
['X1', 'X2', 'X3', 'X4', 'X5', 'X6', 'X7', 'X8', 'X9', 'X10', 'X11', 'X12']

(딴생각) 생각해보니까 for문 뒤에 올수 있는것이 무엇인지 생각하는것도 흥미로울듯

for i in '1234':
    print(i)
1
2
3
4
for i in [1,2,3,4]:
    print(i)
1
2
3
4
for i in (1,2,3,4): # (1,2,3,4)는 튜플
    print(i)
1
2
3
4
for i in {1,2,3,4}: # {1,2,3,4}는 set 
    print(i)
1
2
3
4
for i in {'name':'iu','age':28}: #{'name':'iu','age':28} 는 딕셔너리
    print(i)
name
age
for i in range(1,5): 
    print(i)
1
2
3
4

(숙제)

리스트컴프리헨션을 이용하여 아래와 같은 리스트를 만들어라.

['X1','X2X2','X3X3X3','X4X4X4X4','X5X5X5X5X5']
['X1', 'X2X2', 'X3X3X3', 'X4X4X4X4', 'X5X5X5X5X5']