@nihi1ist

Как развернуть содержимое args?

Пытаюсь решить задачу:
Напишите функцию, которая будет являться аналогом функции zip и сделайте так, чтобы программа работала с любыми итерируемыми типами данных. Циклами (за исключением генераторов), условными операторами и функциями определения типа(isinstance или type) пользоваться нельзя. Функция должна возвращать список из пар кортежей.

Решал похожую задачу, но там была пара коллекций. А тут как мне объяснили, нужно сделать как в оригинале, чтобы можно было обрабатывать произвольное количество коллекций. И вот никак в голове не формируется алгоритм такой функции. Понимаю, что нужно использовать *args. Дальше хочу уже list comprehension прикрутить, но за несколько дней ничего не вышло.
  • Вопрос задан
  • 816 просмотров
Решения вопроса 1
lxstvayne
@lxstvayne
Люблю Python
Можно как-то так сделать:
def my_zip(*iterables):
    min_len = min(map(len, iterables))
    iterators = [iter(iterable) for iterable in iterables]
    return [tuple(map(next, iterators))
            for _ in range(min_len)]
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
kshnkvn
@kshnkvn
yay ✌️ t.me/kshnkvn
from typing import List, Iterable, Any


def super_zip(*args: Iterable) -> List[tuple]:
    count = len(args)
    lengths = {i: len(v) for i, v in enumerate(args)}
    max_values_index = max(lengths, key=lengths.get)

    def extract(chunk_index: int, value_index: int) -> Any:
        try:
            return args[chunk_index][value_index]
        except IndexError:
            return None

    return [
        tuple(extract(ci, vi) for ci in range(count))
            for vi in range(lengths[max_values_index])
    ]


super_zip('abc', [1, 2, 3], ('Z', 'X', 'C'))
# [('a', 1, 'Z'), ('b', 2, 'X'), ('c', 3, 'C')]

super_zip('abc', [1, 2, 3, 4], ('Z', 'X'))
# [('a', 1, 'Z'), ('b', 2, 'X'), ('c', 3, None), (None, 4, None)]

super_zip('abc')
# [('a',), ('b',), ('c',)]
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы