Haikson

[ Everything is possible. Everything takes time. ]

python mapping

Весьма часто используемое понятие при разработке на python - это mapping (отображение). В данном контексте отображением мы называем представление одних данных (некий пул данных) в виде других путем каких либо преобразований. Чтобы было предельно понятно что мы имеем ввиду, предоставлю примеры, где требуется маппинг. Предварительно замечу, что за mapping в python отвечает функция map(function, iterable,...) . Она принимает на вход функцию и итерируемые объекты. Давайте рассмотрим самый простой пример маппинга. Допустим, вам на вход пришел список данных, которые должны быть представлены в виде некоего типа данных: пусть это будет Integer. Как мы знаем, в зависимости от того, откуда пришли данные, их тип может быть представлен по разному. Мы можем знать, что обязательно придет, а можем лишь гадать. Поэтому нам нажно предварительно привести их к "подабающему виду". Вот здесь к нам на помощь приходит функция map().
import sys
argv = sys.argv
# Далее весь список должен превратиться в список целочисленных значений
try:
    argv = map(int, argv)
except ValueError as e:
    print(u"Входные параметры должны быть целочисленными.")
Я думаю здесь понятно. У нас есть функция int, есть список. Мы берем этот список и каждый его член обрабатываем данной функцией. На выходе мы получаем итерируемый объект list с целочисленными данными в этом списке. В случае, если на вход пришло что то иное, мы можем вернуть ошибку. Вот еще один пример того, как удобно менять типы данных маппингом. Задача: дан список, составить предложение, объединив все члены данного списка через пробел.
p = " ".join(map(str, ["Как", "удобен", "mapping!"]))
Самые простые примеры мы рассмотрели (хотя дальше будет еще проще). А теперь посмотрим что еще может делать map. Если на вход вместо функции подать None, то мы получим исходный список.
>>> x = [1,2,3,4]
>>> map(None, x)
[1, 2, 3, 4]
Но это еще не все. Если вы знакомы с функцией zip, то должны помнить, что он объединяет 2 итерируемых объекта по самому короткому и возвращает список кортежей.
>>> x = [1,2,3,4]
>>> y = [5,6,7,8, 9]  # y на 1 длиннее, чем x
>>> zip(x,y)
[(1, 5), (2, 6), (3, 7), (4, 8)]
>>> zip(y,x)
[(5, 1), (6, 2), (7, 3), (8, 4)]
Если стоит задача выводить все, заменяя несуществующие каким либо значением, то добро пожаловать в map.
>>> map(None, x, y)
[(1, 5), (2, 6), (3, 7), (4, 8), (None, 9)]
>>> map(None, y,x)
[(5, 1), (6, 2), (7, 3), (8, 4), (9, None)]
map также на вход может принимать лямбда функцию.
map(lambda a, b: a+b if a and b else None, x, y)
[6, 8, 10, 12, None]
Пожалуй этого достаточно, чтобы вы поняли как работает mapping в python. Думаю теперь вы сможете успешно пользоваться этим прекрасным инструментом в своих проектах.