Извлеките двух- или трёхзначный код региона из конца номера, накопите сумму годов и количество машин по коду. Среднее — сумма, делённая на количество; ведущий ноль региона лучше сохранить.
Подсчёт среднего года выпуска автомобилей по регионам
Извлеките двух- или трёхзначный код региона из конца номера, накопите сумму годов и количество машин по коду. Среднее — сумма, делённая на количество; ведущий ноль региона лучше сохранить.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Имеется класс Car, содержащий государственный номер и год выпуска автомобиля. Требуется вычислить среднее значение года выпуска для каждого региона, используя список cars.
class Car:
def __init__(self, number: str, year: int):
self.number = number
self.year = year
cars = [
Car("a121mm16", 2016),
Car("c313xx16", 2011),
Car("b777xx777", 2007),
Car("a123xx01", 2012),
Car("c888xx777", 2022),
Car("b123xx47", 2002),
]
Задача подразумевает разбор номера машины для получения региона, группировку машин по региону и расчёт среднего года выпуска в каждой группе.
Ответ
Извлеките двух- или трёхзначный код региона из конца номера, накопите сумму годов и количество машин по коду. Среднее — сумма, делённая на количество; ведущий ноль региона лучше сохранить.
Для формата номеров из примера:
import re
def average_years(cars):
totals = {}
for car in cars:
match = re.fullmatch(r'[A-Za-zА-Яа-я]\d{3}[A-Za-zА-Яа-я]{2}(\d{2,3})', car.number)
if match is None:
raise ValueError('Unexpected plate format')
region = match.group(1)
total, count = totals.get(region, (0, 0))
totals[region] = (total + car.year, count + 1)
return {region: total / count for region, (total, count) in totals.items()}
Результат: '16': 2013.5, '777': 2014.5, '01': 2012.0, '47': 2002.0. Это парсер учебного формата, не полная проверка допустимости госномера.