Как лучше применить функцию к элементам вложенного списка в Python?

Всем привет.

Не могу придумать, как быстро и красиво применять функцию к определенному элементу вложенного списка.

Например, имеем список вида имя, пол, год рождения:
[
    ['Саша', 'М', 1993],
    ['Маша', 'Ж', 1990],
    ['Паша', 'М', 1995],
    # и т.д.
]

Допустим, нам необходимо посчитать сколько лет каждому человеку и на выходе получить следующий список:
[
    ['Саша', 'М', 26],
    ['Маша', 'Ж', 29],
    ['Паша', 'М', 24],
    # и т.д.
]

То есть, нам нужно к каждому 3 элементу вложенного списка применить функцию рассчёта возраста. И перезаписать это значение.

Я знаю как это сделать через цикл for, но получается как-то не аккуратно, и не по python way. Так же меня беспокоит вопрос производительности на больших списках.

Я знаю как решить эту задачу простым решением в лоб. Но мне интересно, есть ли какой нибудь python way способ.

Буду рад любым советам. Спасибо.
  • Вопрос задан
  • 287 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Ваша задача решается только перебором, поэтому быстрее, чем циклом сделать не получится. К тому же, for - это вполне питонично.

Другой вариант - это использовать списковое включение для генерации нового списка на основе исходного:
a = [
  ['Саша', 'М', 1993],
  ['Маша', 'Ж', 1990],
  ['Паша', 'М', 1995],
 ...
]
current_year = date.today().year
b = [[n, s, current_year - b] for n, s, b in a]

Или map для той же цели, но вот он как раз совсем не "по питоновски"
b = list(map(lambda i: [i[0], i[1], current_year - i[2]], a))

Или чуточку покрасивее с starmap:
b = list(starmap(lambda n, s, b: [n, s, current_year - b], a))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы