파이썬 (0314) 2주차

리스트
Author

김보람

Published

March 14, 2022

리스트

선언

- 리스트의 선언

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

- 비어있는 리스트의 선언

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

연산

- 더하기연산

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

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

a=[1,2,3]
b=1
a+b
TypeError: can only concatenate list (not "int") to list

- 뺄셈은 정의되지 않음

a=[1,2]
b=[1,2]
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: unsupported operand type(s) for /: 'list' and 'int'

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

a=[1,2,3]
a-[3]   #이런건없다
TypeError: unsupported operand type(s) for -: 'list' and 'list'
a=[1,2,1,2,1,2,]
a/3    # 이런건없다
TypeError: unsupported operand type(s) for /: 'list' and 'int'

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

(예제)

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

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

(풀이1)

type(a)
list
type(a[0])
int
a[0]+b[0]  #a의 첫번째 원소 추출, b의 첫번째 원소 추출, 둘을 더함
4
a[1]+b[1]
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.??로 기능을 사용

파이썬의 기본 패키지 numpy pandas matplotlib

!pip install numpy
Requirement already satisfied: numpy in c:\users\user\anaconda3\lib\site-packages (1.21.5)
import numpy # 설치한 패키지를 쓰겠다고 선언함 library(tidyverse)와 비슷.
a=[1,2]
b=[3,4]
a+b
[1, 2, 3, 4]
type(numpy.array(a))
numpy.ndarray
aa=numpy.array(a)   #aa는 리스트가 아니라 넘파이 어레이, numpy.array()는 numpy패키지에서 제공하는 array함수를 쓰겠다는 의미
bb=numpy.array(b)   
aa+bb
array([4, 6])
a+b
[1, 2, 3, 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]
a[0:3]
[11, 22, 33]

리스트 고급

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

- 객체 - Object - Something

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

lst = [1,3.14,True, 'a', [1,2],
      (1,2), {'name':'iu','age':30},{1,2,3}]
lst
[1, 3.14, True, 'a', [1, 2], (1, 2), {'name': 'iu', 'age': 30}, {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])   # dictionary
dict
type(lst[7]) #집합
set

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

# 컨테이너형이 아닌것
'abcd'[0]
'a'
  • str의 모든 원소는 문자임

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

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

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

(가능한경우)

'boram'[1]
'o'
a=['b','o','r','a','m']
a[0]
'b'
a[0]='B'
a
['B', 'o', 'r', 'a', 'm']

(불가능한경우)

a='boram'
a
'boram'
a[0]
'b'
a[0]='B'
TypeError: 'str' object does not support item assignment

- 리스트 원소 삭제

(예제)

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

a=['b','o','r','a','m']
a
['b', 'o', 'r', 'a', 'm']

사실 더 쉽게 선언할 수 있음

a='boram'   #string으로 a를 선언
type(a)
str
list(a)
['b', 'o', 'r', 'a', 'm']
a=list(a)  #list(a)를 통하여 str을 list로 변환 
a  # 그 결과를 a에 다시 저장
['b', 'o', 'r', 'a', 'm']

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


del a[0]
a
['o', 'r', 'a', 'm']

- 리스트의 원소 추가

(예제) 비어있는 리스틀를 만들고 원소 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?
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?
a.append(5)
a
[1, 2, 3, 4, 5]

(clear)

a=[1,2,3,4]
a.clear?
a.clear()
a
[]

(copy)

a=[1,2,3,4]
a.copy?
b=a.copy()
b
[1, 2, 3, 4]

(count)

a=[1,1,2,3,3,4,4,4,]
a.count(1)
2
a.count(2) #특정 원소가 몇개 포함되어있는지 숫자 세줌
1

(extend)

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

(index)

a=[11,22,'a',True,22]
a.index(True)
3
a.index('a')
2
a.index(22)
1

(insert)

a=[1,2,3]
a.insert(1,88)
a
[1, 88, 2, 3]

(pop)

a=['a',1,2,'d']
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('d')
a
['a', 2, 3]
a.remove('a')
a
[2, 3]

(reverse)

a=[1,2,3,4]
a.reverse()
a
[4, 3, 2, 1]

(sort)

a=[1,3,2,4]
a.sort()
a
[1, 2, 3, 4]

(다른예제들)

a=list('boram')
a
['b', 'o', 'r', 'a', 'm']
a.sort()
a
['a', 'b', 'm', 'o', 'r']
a.sort(reverse=True)
a
['r', 'o', 'm', 'b', 'a']

중첩리스트

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

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

$ \[\begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{bmatrix}\]

$

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

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

성고의 이유를 분석해 보자.

A[0]
[1, 2, 3]
A[0][0]
1

- 매트릭스는 아니지만 매트릭스 같음! - 1차원 배열을 다차원 배열로 확장할 수 있는 기본 아이디어를 제공함

리스트컴프리헨션 (★★★)

- 리스트 컴프리헨션을 이해하기 전에 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

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

(풀이1)

x=[2**0, 2**1, 2**2, 2**3]    ## 2의 0승
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(풀이2) for문을 이용
[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: \text{for} 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']

(풀이)

for i in 'XY':
    for j in '123':
        print(i+j)
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를 만들어라

(풀이)

[i+j for i in ['stat', 'math'] for j in '12345']
['stat1',
 'stat2',
 'stat3',
 'stat4',
 'stat5',
 'math1',
 'math2',
 'math3',
 'math4',
 'math5']

(다른풀이) 참고로 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]]
['X1', 'X2', 'X3', 'X4']
['X'+str(i) for i in [1:100]]   #오류!!
SyntaxError: invalid syntax (1716365648.py, line 1)

[예비학습]

range(0,10)
range(0, 10)
_tmp = range(0,10)
type(_tmp)
range
list(_tmp)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
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칸씩! 
[1, 3, 5, 7, 9]

예비학습 끝

['X'+str(i) for i in list(range(1,101))]  # 세로로 넘 길엉 
['X1',
 'X2',
 'X3',
 'X4',
 'X5',
 'X6',
 'X7',
 'X8',
 'X9',
 'X10',
 'X11',
 'X12',
 'X13',
 'X14',
 'X15',
 'X16',
 'X17',
 'X18',
 'X19',
 'X20',
 'X21',
 'X22',
 'X23',
 'X24',
 'X25',
 'X26',
 'X27',
 'X28',
 'X29',
 'X30',
 'X31',
 'X32',
 'X33',
 'X34',
 'X35',
 'X36',
 'X37',
 'X38',
 'X39',
 'X40',
 'X41',
 'X42',
 'X43',
 'X44',
 'X45',
 'X46',
 'X47',
 'X48',
 'X49',
 'X50',
 'X51',
 'X52',
 'X53',
 'X54',
 'X55',
 'X56',
 'X57',
 'X58',
 'X59',
 'X60',
 'X61',
 'X62',
 'X63',
 'X64',
 'X65',
 'X66',
 'X67',
 'X68',
 'X69',
 'X70',
 'X71',
 'X72',
 'X73',
 'X74',
 'X75',
 'X76',
 'X77',
 'X78',
 'X79',
 'X80',
 'X81',
 'X82',
 'X83',
 'X84',
 'X85',
 'X86',
 'X87',
 'X88',
 'X89',
 'X90',
 'X91',
 'X92',
 'X93',
 'X94',
 'X95',
 'X96',
 'X97',
 'X98',
 'X99',
 'X100']

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

['X'+str(i) for i in range(1,13)]  # 리스트화해주지 않아도 가능 for i in 뒤에 list뿐 아니라.. str도 되고... 
['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):   # 튜플
    print(i)
1
2
3
4
for i in {1,2,3,4}: # set
    print(i)
1
2
3
4
for i in {'name':'iu','age':31}:   # 딕셔너리
    print(i)
name
age
for i in range(1,5):
    print(i)
1
2
3
4

(숙제)

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

[‘X1’,‘X2X2’,‘X3X3X3’,‘X4X4X4X4’,‘X5X5X5X5X5’]

[('X'+str(i))*i for i in range(1,6)]
['X1', 'X2X2', 'X3X3X3', 'X4X4X4X4', 'X5X5X5X5X5']