04wk-2: 파이썬의 자료형 (1)

Author

최규빈

Published

March 29, 2024

1. 강의영상

2. Imports

pass

3. 형변환

- 파이썬의 기본자료형은 int, float, bool, str, list, tuple, dict, set 등이 있다.

  • 0차원 자료형: int, float, bool
  • 1차원 자료형: str, list, tuple, dict, set

A. 사용자가 직접형태변환

- 형태변환: float \(\to\) int

(예시1)

a=3.0
type(a)
float
a=int(a)
type(a)
int

(예시2) 이경우는 정보의 손실이 발생

a=3.14 
int(a)
3

- 형태변환: int \(\to\) float

a=3
type(a)
int
a=float(a)
type(a)
float

- 형태변환: bool \(\to\) int/float, int/float \(\to\) bool

(예시1)

a=True
type(a)
bool
int(a)
1
float(a)
1.0

(예시2)

a=1 
bool(a)
True
a=0
bool(a)
False

(예시3)

a=1.0
bool(a)
True
a=0.0
bool(a)
False

- 이상한 형태변환도 가능하다. (이런것도 바꿔주나 싶은것도 바꿔줌)

bool(-3.14)
True
  • 저는 이런 코드를 의도적으로 사용하지 않아요..
int(3.14)
3

- 형태변환이 항상가능한것도 아님

float(3+0j) # 사실상 3+0j=3 이므로 float으로 형변환하면 3.0이 되어야 할 것 같은데 변환불가능하다. 
TypeError: float() argument must be a string or a real number, not 'complex'

B. 암묵적형변환

- 암묵적형변환 (implicit)

(예비학습) implicit의 의미

  • 추운날씨 -> 보일러좀 틀자! (explicit) / 오늘 날씨 좀 추운 것 같지 않아? (implicit)
  • 짜장면 먹을래? -> 싫어! (explicit) / 난 어제 짜장면 먹었는데.. (implicit)

(예제)

True * 1 # 1을 곱할건데 너 계속 True로 있을꺼야? 
1
1 * 1.0 # 1.0을 곱할건데 너 계속 int로 있을꺼야? 
1.0
True+True # +연산을 할건데 계속 True로 있을꺼야? 
2

4. string

A. 선언

- 예시1

a='guebin'
a
'guebin'

- 예시2

a="guebin"
a
'guebin'

- 예시3

a="asdf'a'sdf"
a
"asdf'a'sdf"

- 예시4

a='asdf"a"sdf'
a
'asdf"a"sdf'

B. 연산

- 더하기(+)연산

a='X'
b='2'
c=a+b
c
'X2'

- 빼기(-)연산

a='X2'
b='2'
a-b
TypeError: unsupported operand type(s) for -: 'str' and 'str'
  • 이런건 없다.

- 곱하기(*)연산

a='X'
a+a+a
'XXX'
a*3 # a*3 = a+a+a = 'X'+'X+'X'
'XXX'

아래도 가능하다.

3*a
'XXX'

그리고 아래도 가능하다.

a='X'
b=3 
a*b
'XXX'

대신에 의미상 맞지 않는 것은 수행되지 않고 에러가 난다.

a='X'
b='Y'
a+b
'XY'
a*b
TypeError: can't multiply sequence by non-int of type 'str'

- 나눗셈(/)연산

2*'X'
'XX'
a='XX'
a/2
TypeError: unsupported operand type(s) for /: 'str' and 'int'
  • 이런건 없다..

C. 인덱싱

- str은 하나의 벡터 문자가 여러개 있는 형태라고 생각하면 된다.

a='guebin'
a
'guebin'
  • 6개의 칸에 글씨가 하나씩 들어가 있음.

- 대괄호 []안에 숫자를 넣는 방식으로 벡터의 원소를 호출할 수 있다. (주의: 인덱스가 0부터 시작함)

a[0] #첫번째원소
'g'
a[1] #두번째원소 
'u'

마지막원소는 -1로 호출할 수도 있다.

a[-1]
'n'

마지막에서 2번째 원소는 -2로 호출가능하다.

a[-2]
'i'

- 요약하면 아래와 같은 방식으로 호출가능함.

g u e b i n
0 1 2 3 4 5
0 -5 -4 -3 -2 -1
a[4]
'i'
a[-2]
'i'
a[-4]
'e'

- :을 이용하여 여러개의 원소를 호출할 수 있음.

a='guebin'
a[0:3] # a[0],a[1],a[2],a[3]이 아니라 a[0],a[1],a[2]까지만 뽑힌다. 즉 마지막의 3은 호출되지 않는다. 
'gue'
a[1:3] # a[1], a[2] 만 호출 // start=1,  stop=3 
'ue'

index=1부터 시작해서 마지막원소까지 호출하려면?

a='guebin'
a[5] # guebin의 마지막원소 'n'이 출려 
'n'
a[1:5] # 5는 포함되지 않으므로 틀림
'uebi'
a[1:6] # 정답
'uebin'

안 헷갈리는 방법은 없을까? 생략한다.

a[1:]
'uebin'

- 생략의 응용1

a='k-pop' 
a
'k-pop'
a[2:]
'pop'

- 생략의 응용2

a='k-pop'
a
'k-pop'
0,1 -> 0,1,2
a[0:2] # a[0],a[1]
'k-'
a[:2] # a[0],a[1] 
'k-'
  • a[:2] 는 a의 원소중 처음 2개를 뽑는다는 의미

- 생략의 응용3

a='k-pop'
a
'k-pop'
a[0:5] # a[0],...,a[4]
'k-pop'
a[:]
'k-pop'

D. str 특수기능

- 파이썬의 변수는 단순히 정보를 담는 그릇이 아니다. 유용한 기능을 제공하는 경우가 있다.

a='ABCD' # a라는 변수는 'ABCD'라는 정보를 담는 그릇의 역할만 하지 않고, 특화된 어떠한 기능도 제공한다. 
a
'ABCD'
a.lower() # a.lower()를 쓰면 a의 모든 문자를 소문자로 바꾸는 기능을 제공, lower(a)라고 읽자!
'abcd'

여기에서 lower()는 문자열에 특화된 기능임. 따라서 당연히 아래는 불가능

a=3.14
a.lower() # lower(a)
AttributeError: 'float' object has no attribute 'lower'

- 자료형에 특화된 기능(=함수)을 확인하는 방법? a.+ tab 으로 목록 확인 가능

a='guebin'
a.upper?
Signature: a.upper()
Docstring: Return a copy of the string converted to uppercase.
Type:      builtin_function_or_method
a.upper() # upper(a) 
'GUEBIN'
a.capitalize() # capitalize(a) 
'Guebin'

- 유용한 특수기능 \((\star\star\star)\)

'-'.join(['1','2','3'])
'1-2-3'
'1-2-3'.split('-')
['1', '2', '3']
'1-2-3'.replace('-','*')
'1*2*3'

E. len

- len함수 소개: 원소의 갯수를 알려주는 함수.

a='ABCD' 
len(a)
4

- 참고: len은 0차원 변수형에서는 동작하지 않고 1차원 변수형에서만 동작한다.

(0차원) len 함수가 동작하지 않음.

a=3.14
len(a)
TypeError: object of type 'float' has no len()
b=True
len(b)
TypeError: object of type 'bool' has no len()

(1차원) len 함수가 잘 동작함.

a='3.14'
len(a)
4
b=[1,2,3]
len(b)
3

F. fstring

- 예제1

a=1
b=2
print(f'a+b = {a+b}')
a+b = 3

- 예제2

a=2
b=3.141592
print(f'a*b = {a*b:.2f}')
a*b = 6.28

- 예제3

a=3.141592
print(f'2a = {2*a:.2f}\t3a = {3*a:.2f}')
2a = 6.28   3a = 9.42

- 예제4

lst = ['장하니','최다호','주성재','이슬기']
[f'{l}학생 안녕하세요, 통계학과 최규빈 교수입니다. 다름이 아니라 전공진로설계관련 상담일자를 잡고자 메일을 보냈습니다.' for l in lst]
['장하니학생 안녕하세요, 통계학과 최규빈 교수입니다. 다름이 아니라 전공진로설계관련 상담일자를 잡고자 메일을 보냈습니다.',
 '최다호학생 안녕하세요, 통계학과 최규빈 교수입니다. 다름이 아니라 전공진로설계관련 상담일자를 잡고자 메일을 보냈습니다.',
 '주성재학생 안녕하세요, 통계학과 최규빈 교수입니다. 다름이 아니라 전공진로설계관련 상담일자를 잡고자 메일을 보냈습니다.',
 '이슬기학생 안녕하세요, 통계학과 최규빈 교수입니다. 다름이 아니라 전공진로설계관련 상담일자를 잡고자 메일을 보냈습니다.']

G. string과 for

- 예제1

for s in 'jbnu':
    print(2*s)
jj
bb
nn
uu

- 예제2

[s*4 for s in 'jbnu']
['jjjj', 'bbbb', 'nnnn', 'uuuu']

H. in 연산자

s = 'jbnu'
'b' in s
True
'c' in s
False
'jb' in s
True
'jn' in s
False

I. 연습문제들

전북대학교 – 아래와 같은 문자열이 있다고 하자.

a='Jeonbuk National University' 

# 문제. 적당한 인덱싱을 통하여 출력결과가 아래와 같도록 하라.

# 적당한 인덱싱
'University'

hint: University는 10글자이다.

(풀이)

a[-10:]
'University'

# 문제. 출력결과가 아래와 같도록 하는 코드를 작성하라. (lower 함수를 이용할 것)

# 적당한 코드 
'jeonbuk national university'

(풀이)

a.lower()
'jeonbuk national university'

# 문제. 아래의 코드를 관찰하고 isupper()의 기능이 무엇인지 스스로 정리해보라.

'A'.isupper()
True
'AA'.isupper()
True
'Aa'.isupper()
False
'aa'.isupper()
False
'aA'.isupper()
False

유추한 기능이 맞는지 ChatGPT를 통하여 확인하라.

Ditto – 다음은 인터넷에서 긁어온 어떠한 텍스트이다.

text = "국내뿐 아니라 해외 인기도 심상치 않다. 2023년 1월 18일 'Ditto'가 빌보드 핫 100에 96위로 진입했다. 이는 K-pop 역사상 데뷔후 최단 빌보드 Hot 100 차트 입성 기록이다. 다른 뮤지션들이 보통 데뷔 후 수년간 쌓아온 팬덤을 기반으로 빌보드에 입성한데 비해, 뉴진스의 기록은 이례적인 것으로 평가받고 있다. 또한 'OMG'가 빌보드 핫 100에 91위로 진입한 동시에 'Ditto'는 85위로 순위가 상승, 핫 100 주간차트에 두 곡을 올려놓았다. K-Pop 역사상 이 차트에 두 곡 이상을 진입시킨 아티스트는 방탄소년단과 블랙핑크가 유일하다. 'Ditto'는 1월 셋째주 기준, 빌보드뿐만 아니라 영국 오피셜 싱글 차트 '톱 100'에 2주 연속 진입하기도 했다."

# 문제. text는 총 몇개의 문장으로 이루어져 있는가?

hint: 이 텍스트의 문장은 모두 .로 끝난다.

(풀이)

len(text.split('. '))
7

# 문제. 각 문장은 몇개의 단어로 이루어져 있는가?

hint: 각 단어는 공백으로 구분된다.

(풀이)

lst = text.split('. ')
[len(l.split(' ')) for l in lst]
[6, 9, 11, 18, 18, 12, 16]

# 문제. 100이라는 단어가 포함된 문장은 모두 몇 개 인가?

hint: 아래의 코드를 관찰

'a' in 'abcd'
True

(풀이)

sum(['100' in l for l in lst])
4

5. list

A. 선언

- 리스트의 선언

a= [1,2,3,22] 

- 비어있는 리스트의 선언

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

B. 연산

- 더하기연산

[1,2,3] + [-3,4,5]
[1, 2, 3, -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 패키지 (파이썬의 여러 수치연산들을 담당하는 라이브러리)

  • 이러한 벡터연산은 누구나 필요로 하는 연산임.
  • 내가 아니더라도 누군가가 프로그램화 해놓았을 것임.
  • 그 누군가가 자신이 만든 코드를 잘 정리하여 무료로 배포했을 수도 있음. (패키지를 배포한다고 표현)
  • 그 패키지를 우리는 가져와서 설치한뒤 사용하기만 하면된다.

설치된 패키지를 사용하는 방법

  • 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])

C. 인덱싱

- str형과 동일한 방식

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

D. 콘테이너형 객체로서의 리스트

- 리스트의 원소는 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(l) for l in lst]
[int, float, bool, str, list, tuple, dict, set]

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

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

E. 가변객체

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

a=[11,22,33]
a
[11, 22, 33]
a[0] = -77
a
[-77, 22, 33]

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

(가능한경우)

a=['g','u','e','b','i','n']
a
['g', 'u', 'e', 'b', 'i', 'n']
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

F. 리스트의 원소 삭제

(예제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.pop(0)
'u'
a
['e', 'b', 'i', 'n']

(예제3) remove를 이용한 원소삭제

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

G. 리스트 원소 추가

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

(풀이1) + 연산이용

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

(풀이2) += 이용

a=[]
a+=[0]
a+=[1] 
a+=[2] 
a
[0, 1, 2]
  • 반복되는 문자를 제거하고 연산의 순서를 바꾼다.

(풀이3) 리스트 특수기능 .append()를 이용

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

- 아래는 불가능하다.

a.append(0).append(1).append(2)
AttributeError: 'NoneType' object has no attribute 'append'
a.append(0,1,2)
TypeError: append() takes exactly one argument (3 given)

H. 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]를 연산하라

I. 리스트 특수기능

(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=['a','a','b','b','b','c']
a.count?
Signature: a.count(value, /)
Docstring: Return number of occurrences of value.
Type:      builtin_function_or_method
a.count('a')
2
a.count('b')
3
a.count('c')
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=[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']

J. 중첩리스트

- 리스트는 리스트를 원소로 받을 수 있으므로 아래와 같이 중첩된 리스트를 만들 수 있다.

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

- A는 1차원인 벡터가 아니라 2차원인 매트릭스로 이해할 수 있다. 구체적으로는 아래와 같은 매트릭스로 이해할 수 있다

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

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

A[1,0] # R에서는 이게 가능했죠
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차원 배열을 다차원 배열로 확장할 수 있는 기본 아이디어를 제공함

K. 리스트 컴프리헨션 연습

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

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

(풀이)

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

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

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

(풀이1)

import itertools
[i+j for i,j in itertools.product('XY','123')]
['X1', 'X2', 'X3', 'Y1', 'Y2', 'Y3']

(풀이2)

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

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

['stat1', 'stat2', 'stat3', 'math1', 'math2', 'math3']
['stat1', 'stat2', 'stat3', 'math1', 'math2', 'math3']

(풀이1)

[i+j for i,j in itertools.product(['stat','math'], '123')]
['stat1', 'stat2', 'stat3', 'math1', 'math2', 'math3']

(풀이2)

[i+j for i in ['stat','math'] for j in '123']
['stat1', 'stat2', 'stat3', 'math1', 'math2', 'math3']

(다른풀이) 비어있는 리스트를 만들고 for문을 쓰면 좀 복잡해진다.

lst = [] 
for x in ['stat','math']: 
    for y in '123': 
        lst.append(x+y)
lst
['stat1', 'stat2', 'stat3', 'math1', 'math2', 'math3']
lst = [] 
for x in ['stat','math']: 
    for y in '123': 
        lst = lst + [x+y]
lst
['stat1', 'stat2', 'stat3', 'math1', 'math2', 'math3']

- 예제: 리스트컴프리헨션과 문자열 'jbnu'를 이용하여 아래와 같은 리스트를 만들어라.

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

(풀이)

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

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

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

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

['X1', 'X2', 'X3', 'X4', 'X5', 'X6', 'X7', 'X8', 'X9', 'X10', 'X11', 'X12']
['X1', 'X2', 'X3', 'X4', 'X5', 'X6', 'X7', 'X8', 'X9', 'X10', 'X11', 'X12']

(풀이)

['X'+str(i) for i in range(1,13)]
['X1', 'X2', 'X3', 'X4', 'X5', 'X6', 'X7', 'X8', 'X9', 'X10', 'X11', 'X12']

L. 리스트 컴프리헨션과 for문의 미묘한 차이

(경우1)

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

(경우2)

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

진짜 미묘하게 다르죠?

M. 연습문제들

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

(풀이1)

a = list()
a
[]

(풀이2)

a = []
a
[]

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

(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)

# 문제. 리스트자료형의 +* 연산을 이용하여 아래와 같은 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]

(풀이)

lst = []
for i in range(1,6):
    lst = lst + [i]*i
lst
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5]

# 문제. 다음과 같은 리스트를 고려하자.

x = [80,60,80,90,55,85,95,100,35,70,75,65,95]
x
[80, 60, 80, 90, 55, 85, 95, 100, 35, 70, 75, 65, 95]

이를 수식으로 표현하면 아래와 같다.

\({\bf x} = [x_1,\dots,x_{13}]=[80,60,80,90,55,85,95,100,35,70,75,65,95]\)

리스트의 원소중 “\(x_i>80\)” 의 조건을 만족하는 원소는 모두 몇개인가?

(풀이)

sum(np.array(x)>80)
5
sum([xi>80 for xi in x])
5

# 문제. 다음과 같은 리스트를 고려하자.

['A','B','C','D','A','A','B','A','F','C','C','C','A']
['A', 'B', 'C', 'D', 'A', 'A', 'B', 'A', 'F', 'C', 'C', 'C', 'A']

이 리스트에서 ‘A’ 혹은 ’B’의 숫자는 모두 몇개인가?

(풀이1)

lst = ['A','B','C','D','A','A','B','A','F','C','C','C','A']
lst.count('A') + lst.count('B')
7

(풀이2)

sum([l<'C' for l in lst])
7

# 문제. 아래와 같은 문자열이 있다고 하자.

test_arr = 'ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSUGPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XAt3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/EnmZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbxNrRFi9wrf+M7Q== schacon@mylaptop.local'

이 문자열에서 대문자의 수를 count하라. (2022년 파이썬입문 중간고사 1-(5) 참고)

(풀이)

sum([s.isupper() for s in test_arr])
155

# 문제. 리스트컴프리헨션을 이용하여 아래와 같은 리스트를 생성하라. (2022년 파이썬입문 중간고사 1-(7) 참고)

['a',
 'aa',
 'aaa',
 'aaaa',
 'aaaaa',
 'aaaaaa',
 'aaaaaaa',
 'aaaaaaaa',
 'aaaaaaaaa',
 'aaaaaaaaaa'] <- a가 10개있음

(풀이)

['a'*i for i in range(1,11)]
['a',
 'aa',
 'aaa',
 'aaaa',
 'aaaaa',
 'aaaaaa',
 'aaaaaaa',
 'aaaaaaaa',
 'aaaaaaaaa',
 'aaaaaaaaaa']

# 문제. 아래와 같은 리스트를 관찰하라.

lst = ['2022/09/21','2022/10/30','2022/12/25','2023/01/01','2023/01/31','2023/03/20']

이러한 리스트를 아래와 같은 리스트로 변환하는 코드를 작성하라.

['2022-09-21', '2022-10-30', '2022-12-25', '2023-01-01', '2023-01-31', '2023-03-20']
['2022-09-21',
 '2022-10-30',
 '2022-12-25',
 '2023-01-01',
 '2023-01-31',
 '2023-03-20']

hint: string의 .replace()기능과 리스트 컴프리헨션의 응용

(풀이)

[l.replace('/','-') for l in lst]
['2022-09-21',
 '2022-10-30',
 '2022-12-25',
 '2023-01-01',
 '2023-01-31',
 '2023-03-20']

# 문제. 아래와 같은 문자열을 고려하라.

'2021. 01. 05.'
'2021. 01. 05.'

띄어쓰기를 제거하는 코드를 구현하라. 즉 출력결과가 아래와 같도록 만드는 코드를 구현하라.

'2021.01.05'
'2021.01.05'

(풀이)

'2021. 01. 05.'.replace(' ','')
'2021.01.05.'

# 문제. 아래와 같이 하나의 특수문자로 이루어진 리스트를 고려하자.

block = ['■'] 

이를 이용하여 아래와 같은 결과를 출력하라.

'■-■-■-■-■-■-■-■-■-■' # 여기에서 '■'는 모두 10개 있음
'■-■-■-■-■-■-■-■-■-■'

(풀이)

'-'.join(block*10)
'■-■-■-■-■-■-■-■-■-■'