Функция map, только не встроеная
Нужно написать функцию, которая возвращает список результатов выполнения заданной функции, к соответствующим элементам переданных итерируемых объектов.
Если переданные итерируемые объекты разной длины, то результат сформировать по кратчайшему итерируемому объекту.
custom_map(sum, [1, 2, 3], [3, 5, 0, 5]) -> [4, 7, 3]
def custom_map(function: Callable, *iterables: Iterable) -> Iterable:
pass
Встроенную функцию map не используем!
Делаю функцией map все получается а вот как без нее имею ввиду без встроенной?
a = [1,2,3]
b = [3,5,0,5]
c = map(lambda x, y:x + y, a, b)
print(list(c))
Ответы (1 шт):
Автор решения: Алексей Р
→ Ссылка
Без map и, на всякий случай, без zip
def custom_map(function, *iterables):
out = []
min_len = None
for i in iterables:
if min_len is None or len(i) < min_len:
min_len = len(i)
for i in range(min_len):
args = []
for j in iterables:
args.append(j[i])
out.append(function(*args))
return out
a = [1, 2, 3]
b = [3, 5, 0, 5]
c = [4, 5, 6, 7]
res = custom_map(lambda x, y, z: x + y + z, a, b, c)
print(list(res))
[8, 12, 9]
Переработанный под iterables код:
def custom_map(function, *iterables):
iters = [iter(i) for i in iterables]
while True:
args = []
for j in iters:
try:
a = next(j)
except StopIteration:
return
args.append(a)
yield function(*args)
a = [1, 2, 3]
b = [3, 5, 0, 5]
c = [4, 5, 6, 7]
print(list(custom_map(lambda x, y, z: x ** 2 + y * z, a, b, c)))
print(list(custom_map(lambda x: x, reversed(a))))
[13, 29, 9]
[3, 2, 1]