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