Lesson 03: 파이썬 자료형 심화개념

Author

최규빈

Published

June 24, 2023

컴프리헨션(\(\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 = 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: \text{ for } i = 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']
  • \(\{x+y : x \in \{{\tt stat},{\tt 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']

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

(풀이)

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

if문이 포함된 컴프리헨션

- 예제: 제곱수중에서 12로 나누어 떨어지는 수만 원소로 가지는 리스트를 만들고 싶다.

  • 제곱수: 1,4,9,16,25,36, …
  • 12로 나누어 떨어지는 수: 36, …

(예비학습)

12 % 4 # %는 나머지를 계산하는 연산자, 12를 4로 나누면 나머지가 0
0
12 % 5 # %는 나머지를 계산하는 연산자, 12를 5로 나누면 나머지가 2
2

(풀이1)

lst = [] 
for i in range(1,101): 
    if (i**2 % 12 == 0): 
        lst.append(i**2)
lst
[36,
 144,
 324,
 576,
 900,
 1296,
 1764,
 2304,
 2916,
 3600,
 4356,
 5184,
 6084,
 7056,
 8100,
 9216]

(풀이2)

[i**2 for i in range(1,101) if (i**2 % 12 == 0)]
[36,
 144,
 324,
 576,
 900,
 1296,
 1764,
 2304,
 2916,
 3600,
 4356,
 5184,
 6084,
 7056,
 8100,
 9216]

튜플고급

튜플을 왜 쓰지? (1)

그냥 리스트를 쓰면 되는거 아닌가 하는 생각이 듭니다. 그냥 튜플은 값이 바뀌지 않는 리스트 느낌. 이게 왜 쓸모있지?

  • 책의설명: 코딩을 하다보면 값을 바꾸지 말아야 할 것을 실수로 값을 바꾸는 경우가 있음. 이런 실수를 방지할 수 있다.
  • shallow copy/deep copy 에 대한 개념을 모르면 생기는 여러가지 side effect이 있음. 이러한 side effect을 막을 수 있는 무기임.

상황1: 다중출력(?)

- 예제: 여러변수를 동시에 출력하고 싶을 경우 (다중출력?)

변수를 아래와 같이 선언하였다고 하자.

a=1
b=2
c=3 
a,b,c
(1, 2, 3)

선언된 값을 확인하려면?

a
1
b
2
c
3

튜플을 이용하면?

a,b,c # 괄호하나 생략하는것이 이렇게 편하다..
(1, 2, 3)

상황2: 다중할당

- 예제: 다중할당1 (여러개의 변수를 동시에 선언하고 싶을 경우)

name, age, sex, height, weight = 'Tom', 20, 'M', 180, 70 
name, age, sex, height, weight
('Tom', 20, 'M', 180, 70)
height
180

- 예제: 다중할당2, 위도와 경도

coor = (37,127) # 서울 
coor
(37, 127)
lat, lon = coor
lat 
37
lon
127

- 잠깐만: 다중할당은 꼭 튜플에서만 가능한가?

그건 아니다…

[x,y,z] = [1,2,3] 
x,y,z # 다중출력 
(1, 2, 3)
[x,y] = 'hi'
x,y 
('h', 'i')

튜플과 같이 사용하면 가독성이 극대화 (그래서 다중할당은 거의 튜플과 세트로 사용함)

x,y,z = 1,2,3
x,y,z # 다중출력 
(1, 2, 3)
x,y = 'hi'
x,y 
('h', 'i')

상황3: 변수값을 교환

- 예제: 임시변수 사용없이 두 변수의 값을 교환

a=10
b=20
a,b = b,a 
a
20
b
10

상황4: for문과 함께

- 예제: for문과 튜플

lst = [['guebin', 202112345, 'M'],
       ['iu',202254321, 'F'],
       ['hodong', 202011223, 'M']]
lst
[['guebin', 202112345, 'M'],
 ['iu', 202254321, 'F'],
 ['hodong', 202011223, 'M']]
for i in lst: 
    print(i)
['guebin', 202112345, 'M']
['iu', 202254321, 'F']
['hodong', 202011223, 'M']
for name,studentid,sex in lst: 
    print(name)
guebin
iu
hodong
for name,studentid,sex in lst: 
    print(name,sex)
guebin M
iu F
hodong M

- 예제: for문과 튜플, dummy variable _

for name,studentid,sex in lst: 
    print(studentid)
202112345
202254321
202011223
for _,studentid,_ in lst: 
    print(studentid)
202112345
202254321
202011223
for _,_,sex in lst: 
    print(sex)
M
F
M
for name,_,sex in lst: 
    print(name,sex)
guebin M
iu F
hodong M

- 예제: for문과 튜플, * 연산자

(motive)

for name,_,_  in lst: 
    print(name)
guebin
iu
hodong
  • 귀찮냐..

(신기술)

for name,*args in lst:
    print(name)
guebin
iu
hodong

인덱싱고급 (스트라이딩)

- 스트라이딩 [start:stop:step]

lst = list('abcdefgh')
lst
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
lst[0:8:2]
['a', 'c', 'e', 'g']
lst[0:8:2]
['a', 'c', 'e', 'g']

- 생략

lst[::2]
['a', 'c', 'e', 'g']
lst[0::2]
['a', 'c', 'e', 'g']
lst[:8:2]
['a', 'c', 'e', 'g']

- 예제: 짝수/홀수 원소 추출

lst
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
lst[::2] # 1,3,5,7, ... 
['a', 'c', 'e', 'g']
lst[1::2] # 2,4,6,8, ... 
['b', 'd', 'f', 'h']

- step = -1 이면?

lst
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
lst[::-1]
['h', 'g', 'f', 'e', 'd', 'c', 'b', 'a']

- 사실 -step은 쓰는 것이 조금 까다롭다. \(\to\) 자주 쓰지말자

함수고급 (조건부리턴)

- 홀수/짝수를 판별하는 함수 만들기 1

def test(a):
    if a % 2 ==0: 
        return 'even'
    else:
        return 'odd'
test(1)
'odd'
test(2)
'even'
test(3)
'odd'
test(4)
'even'
[test(a) for a in range(1,11)]
['odd', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even']

- 홀수/짝수를 판별하는 함수 만들기 2

def test(a):
    return 'even' if a%2 ==0 else 'odd'
[test(a) for a in range(1,11)]
['odd', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even']

len함수

- 0차원 자료형은 len함수가 동작하지 않음

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

note: 이것이 어떠한 수학적인 의미를 가지거나 0차원의 본질적진리를 뜻하는 것은 아님. R에서는 1,3.14,TRUE의 길이가 1로 존재함.

- 1차원 자료형은 len함수가 동작

a='guebin'
len(a)
6
a=[1,2,3,4,5,6]
len(a)
6
a=1,2,3,4,5,6 
len(a)
6
a=range(10)
len(a)
10

- 길이가 1인 1차원 자료형과 0차원 자료형은 다른것임

a='g'
len(a)
1
a=[1] 
len(a)
1
a=(1,)
len(a)
1
a=range(1)
len(a)
1

- 길이가 0인 1차원 자료형도 존재함

a=''
len(a)
0
a=[]
len(a)
0
a=()
len(a)
0
a=range(0)
len(a)
0

str, list, tuple 비교

- str, list, tuple은 모두 시퀀스형이라는 공통점이 있다. \(\to\) 원소의 위치번호로 인덱싱이 가능

lst = [1,2,3,4]
lst[0] # 위치번호=0
1
lst[-1] # 위치번호=-1
4

- str, list, tuple은 차이점도 존재함. 잠깐 정리해보자.

시퀀스형의 카테고리

  • 컨테니어형: list, tuple
  • 균일형: str
  • 가변형: list
  • 불변형: tuple, str

표로 정리하면

컨테니어형 균일형
가변형 list .
불변형 tuple str

- 시퀀스형이 아닌 1차원 자료형도 있을까? (이원소의 위치번호로 인덱싱이 불가능한 자료형

Quiz1

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

(풀이)

list()
[]

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

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

(풀이)

(c)가 정답

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

4. 아래의 코드를 관찰하고, sum()의 기능을 유추하라.

sum([1,0,1,0])
2
sum([True,False,True,False])
2

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\)” 의 조건을 만족하는 원소는 모두 몇개인가?

hint: 리스트컴프리헨션과 sum()함수를 이용할 것

(풀이)

sum([i>80 for i in x])
5

6. 다음과 같은 리스트를 고려하자.

['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’의 숫자는 모두 몇개인가?

hint: 아래를 관찰

'A' < 'C'
True
'B' < 'C'
True

(풀이)

lst = ['A','B','C','D','A','A','B','A','F','C','C','C','A']
sum([l < 'C' for l in lst])
7

7. 아래와 같은 리스트가 있다고 하자.

\({\bf x} = [1,2,1,5,6,2,4,7]\)

\({\bf y} = [3,2,4,1,2,5,6,7]\)

이러한 벡터를 파이썬에서 표현하기 위해서 아래와 같은 리스트를 만들었다고 하자.

x=[1,2,1,5,6,2,4,7]
y=[3,2,4,1,2,5,6,7] 

리스트컴프리헨션을 이용하여

\[{\bf z}=[x_1^2+y_1^2, \dots, x_{8}^2+y_{8}^2]=[x_i^2+y_i^2: \text{for $i = 1,2,3,\dots,8$}]\]

와 같은 리스트를 생성하라.

(풀이)

[x[i]**2+y[i]**2 for i in range(8)]
[10, 8, 17, 26, 40, 29, 52, 98]

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

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

이 문자열에서 대문자의 수를 count하라.

(풀이)

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

9. 리스트컴프리헨션을 이용하여 아래와 같은 리스트를 생성하라.

['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']

10. 아래와 같은 list가 있다고 하자.

test_lst = [['g',1],['u',5],['e',2],['b',8],['i',2],['n',9]]

test_lst와 리스트컴프리헨션을 이용하여 아래를 출력하는 코드를 구현하라. (2022년 파이썬입문 중간고사 1-(9) 참고)

['g', 'uuuuu', 'ee', 'bbbbbbbb', 'ii', 'nnnnnnnnn']
['g', 'uuuuu', 'ee', 'bbbbbbbb', 'ii', 'nnnnnnnnn']

(풀이)

[x*y for x,y in test_lst]
['g', 'uuuuu', 'ee', 'bbbbbbbb', 'ii', 'nnnnnnnnn']

11. 아래와 같은 list를 생성하라.

['1','2','2','3','3','3']

(풀이)

list(''.join([i*int(i) for i in '123']))
['1', '2', '2', '3', '3', '3']

12. 아래와 같은 리스트를 관찰하라.

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']

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

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

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

'2021.01.05'
'2021.01.05'

hint: 아래코드 관찰

'asdf'.replace('a','')
'sdf'

(풀이)

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

14. 아래의 코드를 관찰하라.

'-'.join(['2022','01','05'])
'2022-01-05'
'.'.join(['2022','01','05'])
'2022.01.05'

ChatGPT를 이용하여 이 코드가 의미하는 내용을 유추하라.

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

block = ['■'] 

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

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

hint: join을 이용할 것

(풀이)

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

16. 아래의 실행결과를 되돌리는 코드를 작성하라.

'2023-03-22'.split('-')
['2023', '03', '22']

즉 아래와 같은 리스트를

['2023', '03', '22']
['2023', '03', '22']

아래의 string으로 바꾸는 코드를 작성하라.

'2023-03-22'
'2023-03-22'

hint: join을 이용할 것

(풀이)

'-'.join('2023-03-22'.split('-'))
'2023-03-22'

17. 길이가 1인 튜플을 만들어 자신의 학번을 저장하라. 길이가 1인 튜플을 만들어 자신의 영문이름을 저장하라. 두 튜플을 + 연산자로 합쳐아래와 같은 출력결과를 얻어라. 최종 결과는 예를들면 아래와 같아야 한다.

('2021-43052', 'GuebinChoi')
('2021-43052', 'GuebinChoi')

(풀이)

('2021-43052',) + ('GuebinChoi',)
('2021-43052', 'GuebinChoi')

아래는 파이썬프로그래밍 수강생들의 학번, 이름, 출석점수, 과제점수, 중간고사점수, 기말고사점수를 저장한 중첩리스트이다.

lst = [['2021-43052', 'GuebinChoi', 5, 10, 20, 25],
       ['2019-12342', 'Heung-min Son', 10, 15, 30, 15],
       ['2018-32234', 'hynn', 7, 20, 30, 15],
       ['2022-42323', 'Minji', 8, 20, 20, 35],
       ['2023-55342', 'Hanni', 7, 20, 30, 35],
       ['2022-46624', 'Danielle', 3, 15, 30, 40],
       ['2022-11239', 'Haerin', 10, 20, 30, 40],
       ['2022-32114', 'Hyein', 10, 20, 20, 35]]
lst 
[['2021-43052', 'GuebinChoi', 5, 10, 20, 25],
 ['2019-12342', 'Heung-min Son', 10, 15, 30, 15],
 ['2018-32234', 'hynn', 7, 20, 30, 15],
 ['2022-42323', 'Minji', 8, 20, 20, 35],
 ['2023-55342', 'Hanni', 7, 20, 30, 35],
 ['2022-46624', 'Danielle', 3, 15, 30, 40],
 ['2022-11239', 'Haerin', 10, 20, 30, 40],
 ['2022-32114', 'Hyein', 10, 20, 20, 35]]

18. 파이썬프로그래밍 수강생의 수는 모두 몇명인가?

(풀이)

len(lst)
8

19. 전북대학교 지침에 따라 출석점수가 7보다 작은 학생은 (즉 출석점수 < 7 일 경우) F학점을 부여하게 되어있다. 이 기준에 따르면 F를 받는 학생은 모두 몇명인가?

(풀이)

sum([l[2]<7 for l in lst])
2

20. 파이썬프로그래밍 수업의 경우 출석+레포트 < 21 일 경우 F학점을 부여한다고 한다. 이 기준에 따르면 F를 받는 학생은 모두 몇명인가?

(풀이)

sum([l[2]+l[3]<21 for l in lst])
2

21. 리스트의 정렬순서를 [학번, 이름, …, 기말고사점수] 가 아니라 [이름, 학번, … , 기말고사점수] 와 같이 되도록 변경하는 코드를 작성하라.

(출력예시)

#
[['GuebinChoi', '2021-43052', 5, 10, 20, 25],
 ['Heung-min Son', '2019-12342', 10, 15, 30, 15],
 ['hynn', '2018-32234', 7, 20, 30, 15],
 ['Minji', '2022-42323', 8, 20, 20, 35],
 ['Hanni', '2023-55342', 7, 20, 30, 35],
 ['Danielle', '2022-46624', 3, 15, 30, 40],
 ['Haerin', '2022-11239', 10, 20, 30, 40],
 ['Hyein', '2022-32114', 10, 20, 20, 35]]

(풀이)

[[name,sid,*args] for sid,name,*args  in lst]
[['GuebinChoi', '2021-43052', 5, 10, 20, 25],
 ['Heung-min Son', '2019-12342', 10, 15, 30, 15],
 ['hynn', '2018-32234', 7, 20, 30, 15],
 ['Minji', '2022-42323', 8, 20, 20, 35],
 ['Hanni', '2023-55342', 7, 20, 30, 35],
 ['Danielle', '2022-46624', 3, 15, 30, 40],
 ['Haerin', '2022-11239', 10, 20, 30, 40],
 ['Hyein', '2022-32114', 10, 20, 20, 35]]

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

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

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

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

(풀이)

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

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

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

(풀이)

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

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

hint: 아래의 코드를 관찰

'a' in 'abcd'
True
'a' in ['a','b','c','d']
True
sum(['100' in l.split(' ') for l in text_lst])
2

Quiz2

ssh코드: 1-2

아래의 문자열을 고려하자.

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

1. 이 문자열에서 index = 0,2,4,6,8,... 에 해당하는 원소를 출력하는 코드를 작성하라.

# 출력결과는 아래와 같아야 한다. 
'shraAABNa1cEAAIAAEkOpDrH1SrTpLG9jmBDUP+azHTWhIy5w8HJ9bUriz7lLV49F5VbpSgcaPvkd/TBWFRHoFRtqi1KXHZMiqVRsAwsMvlK7A3aJAnMQx+VW6/Im1uFjJpr8XpDjNyv/bretEm+WOPTI9PVLar2E6/lbg331KtIj2od1rTMVsxrF9r+7= cao@yatplcl'

2. 위 문자열을 뒤집은 문자열을 구하는 코드를 구현하라.

# 출력결과는 아래와 같아야 한다. 
'lacol.potpalym@nocahcs ==Q7M+frw9iFRrNxbsSVqMlTarQ10d1os2njkImtaKn1+3r3wg+b8li/Z68Ec2DryauLMVmPZ98IPTnPZO4WA+ZmnE/trewr0bP/wv6ybNYjvDNpyX88XrrpKJQjlFUuz1bmFIe/86wW0V3+5x9Q1McnsAoJoaF3tAX7/KVlSvFMdsdwQANsjR6V8qLicMsZAHpXhKn1XixqBtiRXF3oAH+RCFXWlByTM/JdOk7vbP3adc0gwSppPbkVQ5XFl9h4fVELElx7MzQivrFUhbj9WJ4HJ81we5Zy4Idh7WYTDHlzfan+lPGUSDWB/mojT9KGTLNpITmrbS71YHfrHDkpUOlkAEQAAAwIBAAAAE2cy1CazN3BAAAA asr-hss'

파이썬 프로그래밍 시험성적: 3-4

아래와 같은 dictionary가 있다고 가정하자.

dct={'202212377': {'att': 65, 'rep': 45, 'mid': 0, 'fin': 10},
     '202212473': {'att': 95, 'rep': 30, 'mid': 60, 'fin': 10},
     '202212310': {'att': 65, 'rep': 85, 'mid': 15, 'fin': 20},
     '202212460': {'att': 55, 'rep': 35, 'mid': 35, 'fin': 5},
     '202212320': {'att': 80, 'rep': 60, 'mid': 55, 'fin': 70},
     '202212329': {'att': 75, 'rep': 40, 'mid': 75, 'fin': 85},
     '202212408': {'att': 65, 'rep': 70, 'mid': 60, 'fin': 75},
     '202212319': {'att': 60, 'rep': 25, 'mid': 20, 'fin': 35},
     '202212348': {'att': 95, 'rep': 55, 'mid': 65, 'fin': 90},
     '202212306': {'att': 90, 'rep': 25, 'mid': 95, 'fin': 50},
     '202212308': {'att': 55, 'rep': 45, 'mid': 75, 'fin': 30},
     '202212366': {'att': 95, 'rep': 60, 'mid': 25, 'fin': 55},
     '202212367': {'att': 95, 'rep': 35, 'mid': 0, 'fin': 25},
     '202212461': {'att': 50, 'rep': 55, 'mid': 90, 'fin': 45}}

여기에서 ‘202212377’ 등은 학번을, att는 출석점수, rep는 레포트점수, mid는 중간고사 점수, fin은 기말고사 점수를 의미한다.

3. 학생들의 학번을 아래와 같은 방식으로 출력하는 코드를 작성하라.

# 출력예시
['202212377',
 '202212473',
 '202212310',
 '202212460',
 '202212320',
 '202212329',
 '202212408',
 '202212319',
 '202212348',
 '202212306',
 '202212308',
 '202212366',
 '202212367',
 '202212461']

4. 출석점수가 70점 이상인(>=70) 학생들의 학번을 출력하는 코드를 작성하라.

# 출력예시 
['2022-12473',
 '2022-12320',
 '2022-12329',
 '2022-12348',
 '2022-12306',
 '2022-12366',
 '2022-12367']

Oxford-III: 5–10 // reference

아래는 이미지 파일명들이 저장된 string을 불러오는 코드이다.

import requests
url = 'https://raw.githubusercontent.com/guebin/PP2023/main/posts/01_PythonBasic/Oxford-IIIT.txt'
txt = requests.get(url).content.decode()

txt의 출력 일부를 나타내면 아래와 같다.

'Abyssinian_1.jpg\nAbyssinian_10.jpg\nAbyssinian_100.jpg\nAbyssinian_100.mat\nAbyssinian_101.jpg\nAbyssinian_101.mat\nAbyssinian_102.jpg\nAbyssinian_102.mat\nAbyssinian_103.jpg\nAbyssinian_104.jpg\nAbyssinian_105.jpg\nAbyssinian_106.jpg\nAbyssinian_107.jpg\nAbyssinian_108.jpg\nAbyssinian_109.jpg\nAbyssinian_11.jpg\nAbyssinian_110.jpg\nAbyssinian_111.jpg\nAbyssinian_112.jpg\nAbyssinian_113.jpg\nAbyssinian_114.jpg\nAbyssinian_115.jpg\nAbyssinian_116.jpg\nAbyssinian_117.jpg\nAbyssinian_118.jpg\nAbyssinian_119.jpg\nAbyssinian_12.jpg\nAbyssinian_120.jpg\nAbyssinian_121.jpg\nAbyssinian_122.jpg\nAbyssinian_123.jpg\nAbyssinian_124.jpg\nAbyssinian_125.jpg\nAbyssinian_126.jpg\nAbyssinian_127.jpg\nAbyssinian_128.jpg\nAbyssinian_129.jpg\nAbyssinian_13.jpg\nAbyssinian_130.jpg\nAbyssinian_131.jpg\nAbyssinian_132.jpg\n ....... 

5. 각 파일명은 \n으로 구분되어있다. 위의 스트링을 분해하여 아래와 같은 리스트를 생성하고 fname_list에 저장하라.

# fname_list 의 출력결과는 아래와 같아야 한다. 
['Abyssinian_1.jpg','Abyssinian_10.jpg', ... ,'yorkshire_terrier_98.jpg', 'yorkshire_terrier_99.jpg']

6. 각 이미지파일명은 아래와 같은 규칙으로 저장되어 있다.

  • 파일명의 첫글자가 대문자이면 고양이를 의미하고 첫글자가 소문자이면 강아지를 의미한다.
  • _ 이전의 영문명은 고양이 혹은 강아지의 종(breed)을 의미한다.

이미지 파일명이 입력으로 오면 강아지인지 고양이인지 판단하여 ‘cat’ or ’dog’를 리턴하는 함수 f를 구현하라.

(함수사용예시)

f('yorkshire_terrier_99.jpg')
'dog'
f('Abyssinian_1.jpg')
'cat'

7. 5의 결과로 나온 fname_list를 입력으로 하고 리스트의 각 원소가 고양이를 의미하는 그림인지 강아지를 의미하는 그림인지 나타내는 리스트를 만들어라.

## 입력예시 
['Abyssinian_1.jpg','Abyssinian_10.jpg',...,'yorkshire_terrier_98.jpg', 'yorkshire_terrier_99.jpg']

## 출력예시
['cat', 'cat', ... , 'dog', 'dog']

8. 강아지 그림과 고양이 그림이 각각 몇 장씩 포함되어 있는지 파악하는 코드를 구현하라.

hint 고양이 2403, 강아지 4990

9. 포메라니안 종의 그림이 몇장있는지 파악하는 코드를 구현하라.

hint: 포메라니안 그림은 파일명에 ‘pomeranian’ 을 포함한다.