Я хочу знать, как я могу сделать функцию python, которая делает то же самое, что и 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]
Используйте 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]
Это может быть достигнуто следующим образом: sumOfLists = map(sum, zip(list1, list2))
Вам также не нужно определять функцию sum
, поскольку она встроена.