Как сделать функцию Python, которая работает как 'mapcar' из lisp

1

Я хочу знать, как я могу сделать функцию python, которая делает то же самое, что и mapcar lisp.

Из документации mapcar lisp:

mapcar работает с последовательными элементами списков. функция применяется к первому элементу каждого списка, затем ко второму элементу каждого списка и т.д. Итерация завершается, когда заканчивается кратчайший список, а лишние элементы в других списках игнорируются. Значение, возвращаемое mapcar, представляет собой список результатов последовательных вызовов функции.

Например,

list1 = [1, 2, 3, 4, 5]
list2 = [5, 4, 3, 2, 1]

def sum(firstNumber, secondNumber):
    return firstNumber + secondNumber

sumOfLists = mapcar(sum, list1, list2)

print(sumOfLists)
# [6, 6, 6, 6, 6]
Теги:
functional-programming
lisp

2 ответа

1

Используйте map, а также есть оператор для добавления operator.add:

>>> import operator
>>> list(map(operator.add, list1, list2))
[6, 6, 6, 6, 6]

Из документации. map принимает функцию как первый аргумент и переменное число итерируемых аргументов. Ключ состоит в том, что функция должна принимать столько аргументов, сколько итерам присваивается map. Это единственное "ограничение", которое нужно учитывать. Так, например:

map(lambda x: x+1,         range(10))
map(lambda x, y: x+y,      range(10), range(10))
map(lambda x, y, z: x+y+z, range(10), range(10), range(10))

И так далее...

Также он может принимать любую другую функцию, определенную пользователем:

def checkString(s):
    return isinstance(s, str) and len(s) > 10

>>> list(map(checkString, ["foo", "fooooooooooooooooooooo"]))
[False, True]
  • 0
    Спасибо за ваш ответ, но как я могу, например, использовать mapcar для функции, которая проверяет, является ли элемент списка строкой? Или другое использование, которое подразумевает неиспользование основной операции. Просто чтобы быть уверенным, как использовать функцию карты как mapcar во всей ее полноте.
  • 0
    @Javierdds, я только расширил ответ
Показать ещё 1 комментарий
1

Это может быть достигнуто следующим образом: sumOfLists = map(sum, zip(list1, list2)) Вам также не нужно определять функцию sum, поскольку она встроена.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню