Получение мин год рождения и смерти Макс год список лет


Очень простая проблема (я учусь на Python) - дали список кортежей, которые представляют (год рождения, год смерти) для группы людей, я хочу найти минимальный "год рождения" и максимальная "год смерти". Вот как я сделал это:

def testmax():
    years = [(1804, 1884), (1885,1997), (1902,1975), (1900,1989)] # sample data

    endyr = max([deathyr for (birthyr,deathyr) in years])
    startyr = min([birthyr for (birthyr,deathyr) in years])
    print(startyr, endyr) # correctly returns 1804 1997

Как видите, я использовать список осмысленностей, чтобы пройти через years список два раза. Время сложность o(2Н) = о(n).

Я могу улучшить это с помощью простой функции, которая длиннее, но делает это через одну итерацию years список — я просто трек (min, max) как мое возвращение переменные, которые я постоянно проверяю на каждой итерации, чтобы получить min и Max лет, что мне нужно, в одну итерацию. Временная сложность = о(n). Что мне не нравится здесь писать больше кода (возможно в тест/интервью, где время ограничено).

Мой вопрос: существует ли лучше/чище/более подходящие для Python способ вы могли бы сделать это? Была бы здесь функция лямда работает, если да, то как? Даже если вы до сих пор это в 2 итерации, я был бы признателен, если бы вы могли демо/объяснить любые изменения в код (возможно, с помощью лямбда), который вы бы использовали.



138
2
задан 3 апреля 2018 в 06:04 Источник Поделиться
Комментарии
1 ответ

Что вы действительно хотите сделать, это перенести отдельные кортежи, Кортежи на 2 - один, содержащий все даты рождения, смерти и другие даты.

К счастью, в Python zip функция может сделать это легко для вас, используя *x синтаксис:

years = [(1804, 1884), (1885,1997), (1902,1975), (1900,1989)]
births, deaths = zip(*years)
# births = (1804, 1885, 1902, 1900)
# deaths = (1884, 1997, 1975, 1989)
print(min(births), max(deaths))
# 1804 1997

5
ответ дан 3 апреля 2018 в 07:04 Источник Поделиться