Как сделать функцию Python, которая работает как 'mapcar' из lisp - PullRequest
0 голосов
/ 03 декабря 2018

Я хочу знать, как я могу сделать функцию 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]

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

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

0 голосов
/ 03 декабря 2018

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

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

Из документации .map принимает функцию в качестве первого аргумента и переменное число iterable аргументов.Ключевым моментом является то, что функция должна принимать столько аргументов, сколько итераций дано 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]
...