[AI Assignment - Python] π νμ ννΈμ μ»΄ν리ν¨μ β WeatherAnalyzer ν΄λμ€ κ΅¬νκΈ°
π― κ³Όμ : WeatherAnalyzer ν΄λμ€ κ΅¬ν
첫 λ²μ§Έ κ³Όμ λ νμ ννΈμ μ»΄ν리ν¨μ μ νμ©ν λ μ¨ λ°μ΄ν° λΆμ ν΄λμ€ λ§λ€κΈ°μ λλ€.
μ λ ₯ λ°μ΄ν°
1
2
3
4
5
6
weather_data = [
{"city": "μμΈ", "date": "2026-04-01", "temp": 15.2, "humidity": 45, "pm25": 32.1},
{"city": "μμΈ", "date": "2026-04-02", "temp": 18.5, "humidity": 52, "pm25": 28.7},
{"city": "λΆμ°", "date": "2026-04-01", "temp": 17.8, "humidity": 61, "pm25": 22.3},
{"city": "λΆμ°", "date": "2026-04-02", "temp": 20.1, "humidity": 58, "pm25": 19.5},
]
μꡬμ¬ν
get_city_avg(city)β νΉμ λμμ temp, humidity, pm25 κ°κ°μ νκ· μ λμ λλ¦¬λ‘ λ°νget_good_air_days(threshold)β pm25κ° threshold μ΄νμΈ λ λ§ νν°λ§ (μ»΄ν리ν¨μ μ¬μ©)summary()β λͺ¨λ λμλ³ νκ· μ{"μμΈ": {...}, "λΆμ°": {...}}ννλ‘ λ°ν (λμ λ리 μ»΄ν리ν¨μ μ¬μ©)- λͺ¨λ ν¨μμ νμ ννΈ μ μ©
1οΈβ£ 1μ°¨ μλ: μΌλ¨ κΈ°μ΅λλ λλ‘ μμ±
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class WeatherAnalyzer:
def __init__(self, list_input: list[dict[str]]):
self._list_input = list_input
def get_city_avg(self, city: str) -> dict[str, float]:
results = {
item["city"]: (item["temp"] + item["humidity"] + item["pm25"]) / 3
for item in self._list_input if item['city'] == city
}
return results
def get_good_air_days(self, threshold: float = 30.0) -> list[dict]:
results = [item for item in self._list_input if item['pm25'] <= threshold]
return results
def summary(self) -> dict[str, dict[str, float]]:
results = [{
item["city"]: (item["temp"] + item["humidity"] + item["pm25"]) / 3
for item in self._list_input
}]
return results
리뷰μμ μ§μ λ°μ μ
νμ
ννΈ μ€λ₯: dict[str]μ μ ν¨νμ§ μμ΅λλ€. dictλ keyμ value νμ
μ λ λ€ λͺ
μν΄μΌ ν©λλ€. κ°μ΄ str, float, int λ± μ¬λ¬ νμ
μ΄ μμ¬ μμΌλ―λ‘ dict[str, Any]λ‘ μ¨μΌ ν©λλ€.
get_city_avg λ‘μ§ μ€λ₯: κ°μ₯ ν° μ€μμμ΅λλ€. μ¨λ, μ΅λ, λ―ΈμΈλ¨Όμ§λ₯Ό ν©μ°ν΄μ 3μΌλ‘ λλλ μλ―Έ μλ κ³μ°μ νκ³ μμμ΅λλ€. μꡬμ¬νμ κ° νλͺ©μ λμλ³ νκ· μ΄μμ΅λλ€.
1
2
3
4
5
# λ΄κ° ν κ² (νλ¦Ό)
(item["temp"] + item["humidity"] + item["pm25"]) / 3 # β μλ―Έ μλ μ«μ
# κΈ°λν κ²
{"temp": 18.95, "humidity": 59.5, "pm25": 20.9} # β κ° νλͺ©λ³ νκ·
λμ λ리 ν€ μ€λ³΅ λ¬Έμ : μ»΄ν리ν¨μ μμ κ°μ ν€(βλΆμ°β)κ° μ¬λ¬ λ² λμ€λ©΄ λ§μ§λ§ κ°λ§ λ¨μ΅λλ€. μ¦ λΆμ° 4/1 λ°μ΄ν°κ° μ¬λΌμ§λλ€.
summaryμ λ°ν νμ
λΆμΌμΉ: 리μ€νΈλ‘ κ°μΈμ list[dict]λ₯Ό λ°ννκ³ μμλλ°, μꡬμ¬νμ dict[str, dict]μ΄μμ΅λλ€.
2οΈβ£ 2μ°¨ μλ: λ‘μ§ μμ + dataclass λμ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from dataclasses import dataclass, field
from typing import Any
@dataclass
class WeatherAnalyzer:
city: str
date: str
temp: float
humidity: int
pm25: float
def __init__(self, list_input: list[dict[str, Any]]):
self._list_input = list_input
def get_city_avg(self, city: str) -> dict[str, float]:
results = {
city: [
{'temp': sum(data['temp'] for data in self._list_input if data['city'] == city) /
len([data for data in self._list_input if data['city'] == city])},
{'humidity': sum(data['humidity'] for data in self._list_input if data['city'] == city) /
len([data for data in self._list_input if data['city'] == city])},
{'pm25': sum(data['pm25'] for data in self._list_input if data['city'] == city) /
len([data for data in self._list_input if data['city'] == city])},
]
}
return results
def summary(self) -> dict[str, dict[str, float]]:
cities = set(d['city'] for d in self._list_input)
results = {item: self.get_city_avg(item) for item in cities}
return results
μ’μμ§ μ
- νλͺ©λ³ νκ· μ λ°λ‘ ꡬνλ λ°©ν₯μ λ§μμ΅λλ€.
summary()μμget_city_avg()λ₯Ό μ¬νμ©νλ μ€κ³λ μ’μμ΅λλ€.
μ¬μ ν λ¨μ λ¬Έμ
@dataclass μ€μ©: @dataclassλ __init__μ μλ μμ±ν΄μ£Όλ λ°μ½λ μ΄ν°μΈλ°, μ§μ __init__μ μ μνλ©΄ μλμμ±μ΄ 무μλ©λλ€. μμ μ μΈν city, date λ±μ νλλ μ€μ λ‘ μ¬μ©λμ§ μμμ΅λλ€.
λ°ν ꡬ쑰: dict μμ list μμ dict 3κ°λΌλ λΆνμνκ² λ³΅μ‘ν κ΅¬μ‘°κ° λ§λ€μ΄μ‘μ΅λλ€.
1
2
3
4
5
# λ΄ λ°νκ° (λ무 볡μ‘)
{"λΆμ°": [{"temp": 18.95}, {"humidity": 59.5}, {"pm25": 20.9}]}
# κΈ°λν λ°νκ° (μ¬ν)
{"temp": 18.95, "humidity": 59.5, "pm25": 20.9}
κ°μ νν°λ§μ΄ 6λ² λ°λ³΅: data['city'] == city νν°λ§μ temp, humidity, pm25λ§λ€ sumκ³Ό lenμμ κ°κ° λ°λ³΅νκ³ μμμ΅λλ€. μ΄ 6λ². λ¨Όμ ν λ² νν°λ§νκ³ μ¬μ¬μ©νλ©΄ λ©λλ€.
3οΈβ£ 3μ°¨ μλ (μ΅μ’ ): νΌλλ°± λ°μ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from typing import Any
class WeatherAnalyzer:
def __init__(self, list_input: list[dict[str, Any]]):
self._list_input = list_input
def get_city_avg(self, city: str) -> dict[str, float]:
city_data = [d for d in self._list_input if d['city'] == city]
n = len(city_data)
results = {
'temp': sum(d['temp'] for d in city_data) / n,
'humidity': sum(d['humidity'] for d in city_data) / n,
'pm25': sum(d['pm25'] for d in city_data) / n,
}
return results
def get_good_air_days(self, threshold: float = 30.0) -> list[dict]:
return [item for item in self._list_input if item['pm25'] <= threshold]
def summary(self) -> dict[str, dict[str, float]]:
cities = set(d['city'] for d in self._list_input)
return {city: self.get_city_avg(city) for city in cities}
μ€ν κ²°κ³Ό
1
2
3
get_city_avg('λΆμ°') β {'temp': 18.95, 'humidity': 59.5, 'pm25': 20.9}
get_good_air_days(20) β [{'city': 'λΆμ°', 'date': '2026-04-02', 'temp': 20.1, 'humidity': 58, 'pm25': 19.5}]
summary() β {'λΆμ°': {'temp': 18.95, ...}, 'μμΈ': {'temp': 16.85, ...}}
π λͺ¨λ²λ΅μκ³Ό λΉκ΅
리뷰μμ λ°μ λͺ¨λ²λ΅μμλ λͺ κ°μ§ μΆκ° ν ν¬λμ΄ μμμ΅λλ€.
νλ λ°λ³΅μ μμλ‘ μ κ±°
1
2
3
4
5
6
7
class WeatherAnalyzer:
FIELDS = ('temp', 'humidity', 'pm25')
def get_city_avg(self, city: str) -> dict[str, float]:
city_data = [d for d in self._data if d['city'] == city]
n = len(city_data)
return {f: round(sum(d[f] for d in city_data) / n, 2) for f in self.FIELDS}
FIELDSλ₯Ό μμλ‘ μ μν΄λλ©΄ νλκ° μΆκ°λμ΄λ ν κ³³λ§ μμ νλ©΄ λ©λλ€. λμ
λ리 μ»΄ν리ν¨μ
μΌλ‘ 3μ€μ΄ 1μ€λ‘ μ€μ΄λλλ€.
λ°©μ΄ μ½λ
1
2
if not city_data:
raise ValueError(f"λμ '{city}'μ λ°μ΄ν°κ° μμ΅λλ€")
β οΈ μ‘΄μ¬νμ§ μλ λμλ₯Ό λ£μΌλ©΄
n = 0μ΄ λμ΄ZeroDivisionErrorκ° λ°μν©λλ€. μ€λ¬΄μμλ μ΄λ° μ£μ§ μΌμ΄μ€λ₯Ό νμ κ³ λ €ν΄μΌ ν©λλ€.
__repr__ ꡬν
1
2
def __repr__(self) -> str:
return f"WeatherAnalyzer({len(self._data)}건, λμ: {sorted({d['city'] for d in self._data})})"
print(analyzer) νμ λ κ°μ²΄ μ 보λ₯Ό νλμ λ³Ό μ μμ΄ λλ²κΉ
μ μ μ©ν©λλ€.
π μ΄λ² κ³Όμ μμ λ°°μ΄ κ²
νμ
ννΈ: dict[str]μ΄ μλλΌ dict[str, Any]μ²λΌ key/value νμ
μ λͺ¨λ λͺ
μν΄μΌ ν©λλ€. λͺ¨λ Pythonμμ νμ
ννΈλ μ νμ΄ μλ μ¬μ€μ νμ€μ
λλ€.
μ»΄ν리ν¨μ μ ν¨μ : λμ λ리 μ»΄ν리ν¨μ μμ κ°μ ν€κ° μ¬λ¬ λ² λμ€λ©΄ λ§μ§λ§ κ°λ§ λ¨μ΅λλ€. λ°μ΄ν°λ₯Ό λ¨Όμ κ·Έλ£Ήννκ³ μ§κ³ν΄μΌ ν©λλ€.
@dataclassμ μ©λ: @dataclassλ λ°μ΄ν°λ₯Ό λ΄λ ν΄λμ€μ μ°λ κ²μ΄μ§, λ‘μ§ μ€μ¬μ λΆμ ν΄λμ€μ μ΅μ§λ‘ λΌμλ£μ νμκ° μμ΅λλ€.
νν°λ§ ν λ², μ¬μ¬μ© μ¬λ¬ λ²: κ°μ 쑰건μ νν°λ§μ λ°λ³΅νμ§ λ§κ³ λ³μμ λ΄μμ μ¬μ¬μ©ν©λλ€. κ°λ μ±κ³Ό μ±λ₯ λͺ¨λ μ’μμ§λλ€.
Tip: λ©μλ μμ