Функция 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]
→ Ссылка