07wk-1: 퀴즈4

Author

최규빈

Published

April 17, 2024

Caution
  • 전북대 학생들을 시험당일 학생증을 지참할 것. (출석체크 및 본인확인) 학생증 외에 신분증 여권등도 가능.
  • 부정행위 (카카오톡 채팅을 통한 코드공유, 생성형모델 사용, 대리시험 등) 적발시 F 처리함.
  • 퀴즈 중 지각할 경우 지각사실을 기록함. 하지만 별 다른 감점은 하지 않음.
  • .ipynb 파일 형태로 제출된 답안지만 채점하며 그 외의 형식 (.hwp, .py 등)은 채점하지 않음. 즉 0점 처리함.
import numpy as np
import pandas as pd

1. – 10점

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

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

중간고사와 기말고사의 합이 60점 이상인 학생은 몇명인가? (확장 가능한 코드만 정답으로 인정)

(풀이)

len([l for l in lst if sum(l[-2:])>=60])
3

2. – 10점

아래의 list를 관찰하라.

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

(풀이)

[l.replace('/','.')+'.' for l in lst]
['2022.09.21.',
 '2022.10.30.',
 '2022.12.25.',
 '2023.01.01.',
 '2023.01.31.',
 '2023.03.20.']

3. – 10점

아래의 문자열을 관찰하라.

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

‘A’ 가 몇개 있는지 count하라

(풀이)

list(test_arr).count('A')
18
test_arr.count('A')
18

4. – 10점

모두 맞출경우만 정답으로 인정

(1) 아래의 조건을 만족하는 자료형 a를 선언하라.

type(a), len(a), a[0]
(tuple, 1, 'a')

(풀이)

a= ('a',)
type(a), len(a), a[0]
(tuple, 1, 'a')

(2) 아래와 같은 출력결과를 보이는 numpy array a,b 를 선언하라.

a, a.shape
(array(3), ())
b, b.shape
(array([3]), (1,))

(풀이)

a = np.array(3)
b = np.array([3])
a, a.shape
(array(3), ())
b, b.shape
(array([3]), (1,))

5. – 20점

모두 맞출경우만 정답으로 인정

아래와 같은 2차원 numpy array를 선언하라.

np.random.seed(43052)
X = np.random.randn(20,5).round(2)
X
array([[ 0.38,  1.08,  1.14,  0.31,  0.24],
       [ 0.36, -1.66, -1.38, -1.93, -1.49],
       [ 0.01, -0.03, -0.34,  0.71, -1.55],
       [ 1.35, -0.06, -0.83, -1.46, -0.35],
       [-0.34,  0.76,  2.22, -1.72,  1.59],
       [ 0.37,  0.77, -0.43,  0.77,  0.92],
       [-0.45,  0.32,  0.82, -0.17,  1.13],
       [ 0.21, -1.68, -0.3 ,  0.62, -0.3 ],
       [-0.25, -1.16, -1.29, -0.63, -0.7 ],
       [ 1.27,  0.84, -1.46, -0.17,  1.29],
       [ 0.36, -0.1 , -0.83, -0.65,  0.07],
       [-2.47,  1.39, -0.06, -0.84, -0.38],
       [ 1.33,  0.17, -0.51, -1.27,  1.74],
       [-0.36, -0.18,  0.62,  0.45, -0.4 ],
       [-1.07, -0.18, -1.42, -0.69,  0.74],
       [ 2.19, -1.15, -0.28, -0.5 , -1.66],
       [-2.22,  0.42, -0.59,  0.17, -0.01],
       [-1.83,  0.26, -0.61,  0.14, -0.02],
       [-0.99,  0.73,  0.37,  0.34,  0.55],
       [ 1.31,  0.41, -0.19,  1.06,  1.19]])

(1) 열별로(column-wise) X의 평균을 계산하라.

# 답: np.array([-0.042 ,  0.0475, -0.2675, -0.273 ,  0.13  ])

(풀이)

X.mean(axis=0)
array([-0.042 ,  0.0475, -0.2675, -0.273 ,  0.13  ])

(2) 행별로(row-wise) X의 최대값과 최소값의 차이를 계산하라.

# 답: np.array([0.9 , 2.29, 2.26, 2.81, 3.94, 1.35, 1.58, 2.3 , 1.04, 2.75, 1.19, 3.86, 3.01, 1.02, 2.16, 3.85, 2.64, 2.09, 1.72, 1.5 ])

(풀이)

X.max(axis=1) - X.min(axis=1) 
array([0.9 , 2.29, 2.26, 2.81, 3.94, 1.35, 1.58, 2.3 , 1.04, 2.75, 1.19,
       3.86, 3.01, 1.02, 2.16, 3.85, 2.64, 2.09, 1.72, 1.5 ])

6. – 40점

각 20점

아래의 코드를 실행하여 data를 생성하라.

data = pd.read_csv('https://raw.githubusercontent.com/guebin/DV2021/master/_notebooks/2021-10-25-FIFA22_official_data.csv').drop(['Loaned From','Marking'],axis=1).dropna().loc[:,['Name','Nationality','Overall']].to_numpy().tolist()

data는 list로 만들어져 있으며 각 원소는 축구선수들의 능력치를 나타낸다. data의 각 원소는 [이름,소속국가,능력치]를 의미하며 처음 5개의 원소는 아래와 같다.

data[:5]
[['Bruno Fernandes', 'Portugal', 88],
 ['L. Goretzka', 'Germany', 87],
 ['L. Suárez', 'Uruguay', 88],
 ['K. De Bruyne', 'Belgium', 91],
 ['M. Acuña', 'Argentina', 84]]

(1) 아래의 dictionary를 이용하여 data의 국가이름을 대륙이름으로 바꾸라.

continent_dict = {
    'Asia': ['Afghanistan', 'Japan', 'Macau', 'Chinese Taipei', 'Indonesia', 'Korea Republic', 'Kazakhstan', 'Kyrgyzstan', 'Bhutan', 'Philippines', 'Syria', 'China PR', 'Oman', 'Guam', 'Vietnam', 'Jordan', 'Palestine', 'Malaysia', 'Hong Kong', 'Korea DPR', 'Lebanon', 'Uzbekistan', 'India','Iraq', 'Iran', 'Saudi Arabia', 'United Arab Emirates','Australia'],
    'Europe': ['Portugal', 'Germany', 'Belgium', 'Netherlands', 'Croatia', 'Spain', 'Austria', 'Italy', 'France', 'Serbia', 'England', 'Poland', 'Ukraine', 'Wales', 'Scotland', 'Czech Republic', 'Slovakia', 'Romania', 'Bosnia and Herzegovina', 'Republic of Ireland', 'Norway', 'Sweden', 'Bulgaria', 'Lithuania', 'Estonia', 'Latvia', 'Liechtenstein','Albania','Denmark','Finland','Greece','Hungary','Iceland','Luxembourg','Northern Ireland','Slovenia','Switzerland','Andorra','Azerbaijan','Belarus','Cyprus','Faroe Islands','Georgia','Kosovo','Malta','Moldova','Montenegro','North Macedonia','Armenia','Gibraltar','Russia','Turkey','Israel'],
    'South America': ['Uruguay', 'Argentina', 'Brazil', 'Chile', 'Colombia', 'Ecuador', 'Paraguay', 'Venezuela', 'Suriname', 'Bolivia','Peru','Guyana'],
    'Africa': ['Egypt', "Côte d'Ivoire", 'Senegal', 'Morocco', 'Ghana', 'Algeria', 'Guinea', 'Mali', 'Congo DR', 'Liberia', 'Cameroon', 'Tunisia', 'Comoros', 'Kenya', 'South Africa', 'Zimbabwe', 'Madagascar', 'Mozambique', 'Equatorial Guinea', 'Congo', 'Burundi', 'Grenada', 'Thailand', 'Togo', 'Sudan', 'Mauritania','Guinea Bissau','Libya','Nigeria','Zambia','Angola','Benin','Burkina Faso','Cape Verde Islands','Central African Republic','Chad','Eritrea','Gabon','Gambia','Mauritius','Namibia','Rwanda','Sierra Leone','South Sudan','São Tomé e Príncipe','Uganda','Niger'],
    'North and Central America': ['Antigua and Barbuda', 'Barbados', 'Belize', 'Bermuda', 'Canada', 'Costa Rica', 'Cuba', 'Curacao', 'Dominican Republic', 'El Salvador', 'Guatemala', 'Haiti', 'Honduras', 'Jamaica', 'Mexico', 'Montserrat', 'Panama', 'Puerto Rico', 'Saint Kitts and Nevis', 'Saint Lucia', 'Trinidad and Tobago', 'United States'],
    'Oceania': ['New Zealand', 'Fiji', 'Papua New Guinea','New Caledonia'],
}

바뀐 data의 처음 5개의 출력결과는 아래와 같다.

[['Bruno Fernandes', 'Europe', 88],
 ['L. Goretzka', 'Europe', 87],
 ['L. Suárez', 'South America', 88],
 ['K. De Bruyne', 'Europe', 91],
 ['M. Acuña', 'South America', 84]]

(풀이)

data2 = [
    [name,continent,overall] \
    for name,nationality,overall in data \
    for continent in continent_dict \
    if nationality in continent_dict[continent]
]
data2[:5]
[['Bruno Fernandes', 'Europe', 88],
 ['L. Goretzka', 'Europe', 87],
 ['L. Suárez', 'South America', 88],
 ['K. De Bruyne', 'Europe', 91],
 ['M. Acuña', 'South America', 84]]

(2) 능력치가 80 보다 큰 선수들은 대륙별로 몇명의 선수가 있는가? count하라.

# 답
# {'South America': 71,
#  'Africa': 21,
#  'North and Central America': 8,
#  'Europe': 272,
#  'Asia': 1}

(풀이)

lst = [continent for _,continent,overall in data2 if overall>80]
{s:lst.count(s) for s in set(lst)}
{'Africa': 21,
 'North and Central America': 8,
 'Europe': 272,
 'South America': 71,
 'Asia': 1}