LINUX.ORG.RU

Python, реализация zip(*zipped)

 , , , ,


1

1

Привет, ЛОР!

Делаю задачку с формулировкой «Сделайте свою реализацию zip() из стандартной библиотеки python.»

Со стандартной задачей функции - распихать элементы списков по кортежам, проблем не возникло.

Но что-то не могу нагуглить, как обработать случай zip(*ZIPPED), который, собственно, делает unzip имеющихся кортежей обратно в списки.

Подскажите, пожалуйста, куда копать?

★★

Уточню вопрос: aster перед переменной говорит о том, что нужно сделать unzip. Выходит, надо получать имена аргументов и смотреть .startswith('*') ? Или есть более адекватный метод?

kir64 ★★ ()

А оно не является особым случаем, если я правильно понял. Если смотреть по этому примеру:

>>> x = [1, 2, 3]
>>> y = [4, 5, 6]
>>> zipped = zip(x, y)
>>> zipped
[(1, 4), (2, 5), (3, 6)]
>>> x2, y2 = zip(*zipped)
>>> x == list(x2) and y == list(y2)
True
В третьей и пятой строчках сама функция выполняет одинаковые операции.

Deleted ()

Если ты правильно реализовал zip(), то zip(*zip(a, b, c)) должен быть обратной операцией к zip(a, b, c) по самой логике работы zip, потому что:

zip(a, b, c) == [(a[0], b[0], c[0]), (a[1], b[1], c[1])...] #точнее, не список, а особый итерируемый объект, но не важно
*zip(a, b, c) == (a[0], b[0], c[0]), (a[1], b[1], c[1])...
zip(*zip(a, b, c)) == zip((a[0], b[0], c[0]), (a[1], b[1], c[1]), (a[2], b[2], c[2])...) == [(a[0], a[1], a[2]...), (b[0], b[1], b[2]...), (c[0], c[1], c[2]...)]
x, y, z = zip(*zip(a, b, c))
x == a and y == b and z == c

proud_anon ★★★★★ ()
Последнее исправление: proud_anon (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.