Свой zip 2 python

Свой ZIP

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

Функция должна возвращать список из пар кортежей.

Для решение нужно использовать рекурсию

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
def myzip(*args): f_lst =[list(elem) for elem in args] length = min((len(elem) for elem in args)) snd_lst = list(tuple(elem[i] for elem in f_lst) for i in range(length)) return snd_lst user_list = [1, 2, 'a', 'b'] user_dict = {1: 'a', 2: 'b'} user_tuple = 1, 2, 'a', 'b' user_string = '12ab' user_set = {1, 2, 'a', 'b'} print(myzip(user_list)) print(myzip(user_dict)) print(myzip(user_tuple)) print(myzip(user_string)) print(myzip(user_set))

Задание «свой zip»
Напишите функцию, которая будет полным аналогом функции zip, и сделайте так, чтобы программа.

Задача с zip for
Помогите решить: Мы делаем MVP dating-сервиса, и у нас есть список парней и девушек (их число.

zip n списков
Для примера есть 3 списка a = b = c = Стандартно мы делаем list(zip(a,b,c,)) А как быть.

Архивация с zip
Здравствуйте пытаюсь освоить архивацию файлов через zip ,но не получается запустить,код прилагаю: .

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
def myzip(*args): f_lst =[list(elem) for elem in args] length = min((len(elem) for elem in args)) snd_lst = list(tuple(elem[i] for elem in f_lst) for i in range(length)) return snd_lst user_list = [1, 2, 'a', 'b'] user_dict = {1: 'a', 2: 'b'} user_tuple = 1, 2, 'a', 'b' user_string = '12ab' user_set = {1, 2, 'a', 'b'} assert myzip(user_list, user_list) == zip(user_list, user_list) assert myzip(user_dict, user_dict) == zip(user_dict, user_dict) assert myzip(user_tuple, user_tuple) == zip(user_tuple, user_tuple) assert myzip(user_string, user_string) == zip(user_string, user_string) assert myzip(user_set, user_set) == zip(user_sey, user_set)

Я понимаю, что и это неверно, но суть в том, что я вообще не вникаю как это сделать
Не говоря уже о требуемой рекурсии

Читайте также:  Python decimal from string

Добавлено через 13 минут
Без рекурсии Вот код.

1 2 3 4 5 6 7 8 9 10 11 12 13
def analog_zip(*args: iter) -> tuple: """ Мой аналог функции zip() :param args: кортеж итерируемых объектов. :return: кортеж из нескольких источников данных. """ count = 0 while True: try: yield tuple(i[count] for i in args) count += 1 except IndexError: break

Зачем в этой задаче рекурсия я не знаю.
Ну можно приделать.

Добавлено через 24 минуты

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
def analog_zip_2(*args: iter, count=0, zip_list=[]) -> list[tuple]: """ Мой аналог функции zip() Возвращает список кортежей. :param args: кортеж итерируемых объектов. :return: список кортежей из нескольких источников данных. :count: Для рекурсии. :list: Для рекурсии. """ try: zip_list.append(tuple(i[count] for i in args)) analog_zip_2(*args, count=count + 1, zip_list=zip_list) except IndexError: return zip_list return zip_list

ЦитатаСообщение от romaromar3 Посмотреть сообщение

Вы что изучаете? Как можно было дойти до 21 модуля и не понимать программирования, а как будете остальные задачи решать? Вроде нормально все разжевывают в видео.

Berbentsev, решение неверное:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
def analog_zip(*args: iter) -> tuple: """ Мой аналог функции zip() :param args: кортеж итерируемых объектов. :return: кортеж из нескольких источников данных. """ count = 0 while True: try: yield tuple(i[count] for i in args) count += 1 except IndexError: break myzip = analog_zip user_list = [1, 2, 'a', 'b'] user_dict = {1: 'a', 2: 'b'} user_tuple = 1, 2, 'a', 'b' user_string = '12ab' user_set = {1, 2, 'a', 'b'} assert list(myzip(user_list, user_list)) == list(zip(user_list, user_list)) assert list(myzip(user_dict, user_dict)) == list(zip(user_dict, user_dict)) assert list(myzip(user_tuple, user_tuple)) == list(zip(user_tuple, user_tuple)) assert list(myzip(user_string, user_string)) == list(zip(user_string, user_string)) assert list(myzip(user_set, user_set)) == list(zip(user_set, user_set))

КулХацкеръ, Да есть такое, со словарями не проходит.

Добавлено через 9 минут
Можно записать list(i)[count] и будет норм.

Добавлено через 5 минут
args = list(map(list, args))
Или так.

Лучший ответ

Сообщение было отмечено romaromar3 как решение

Решение

ЦитатаСообщение от КулХацкеръ Посмотреть сообщение

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
def analog_zip(*args: iter) -> tuple: """ Мой аналог функции zip() :param args: кортеж итерируемых объектов. :return: кортеж из нескольких источников данных. """ count = 0 args = list(map(list, args)) while True: try: yield tuple(i[count] for i in args) count += 1 except IndexError: break myzip = analog_zip user_list = [1, 2, 'a', 'b'] user_dict = {1: 'a', 2: 'b'} user_tuple = 1, 2, 'a', 'b' user_string = '12ab' user_set = {1, 2, 'a', 'b'} assert list(myzip(user_list, user_list)) == list(zip(user_list, user_list)) assert list(myzip(user_dict, user_dict)) == list(zip(user_dict, user_dict)) assert list(myzip(user_tuple, user_tuple)) == list(zip(user_tuple, user_tuple)) assert list(myzip(user_string, user_string)) == list(zip(user_string, user_string)) assert list(myzip(user_set, user_set)) == list(zip(user_set, user_set))

Уже лучше. Добавил ещё один хитрый тест, сможете?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
def analog_zip(*args: iter) -> tuple: """ Мой аналог функции zip() :param args: кортеж итерируемых объектов. :return: кортеж из нескольких источников данных. """ count = 0 args = list(map(list, args)) while True: try: yield tuple(i[count] for i in args) count += 1 except IndexError: break myzip = analog_zip user_list = [1, 2, 'a', 'b'] user_dict = {1: 'a', 2: 'b'} user_tuple = 1, 2, 'a', 'b' user_string = '12ab' user_set = {1, 2, 'a', 'b'} assert list(myzip(user_list, user_list)) == list(zip(user_list, user_list)) assert list(myzip(user_dict, user_dict)) == list(zip(user_dict, user_dict)) assert list(myzip(user_tuple, user_tuple)) == list(zip(user_tuple, user_tuple)) assert list(myzip(user_string, user_string)) == list(zip(user_string, user_string)) assert list(myzip(user_set, user_set)) == list(zip(user_set, user_set)) def bar(): global foo for i in range(10): foo += 1 yield i foo = 0 list(zip([1, 2, 3], bar())) truezip_foo = foo foo = 0 list(myzip([1, 2, 3], bar())) assert truezip_foo == foo

КулХацкеръ,
Да понятно что работает медленнее, и лишние вычисления делает. Но это всего лишь аналог. Ну можно попробовать сделать лучше. Сейчас подумаем.

Добавлено через 39 минут

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
def analog_zip(*args: iter) -> tuple: """ Мой аналог функции zip() :param args: кортеж итерируемых объектов. :return: кортеж из нескольких источников данных. """ count = 0 args = list(map(iter, args)) while True: try: yield tuple(next(i) for i in args) count += 1 except RuntimeError: break myzip = analog_zip user_list = [1, 2, 'a', 'b'] user_dict = {1: 'a', 2: 'b'} user_tuple = 1, 2, 'a', 'b' user_string = '12ab' user_set = {1, 2, 'a', 'b'} assert list(myzip(user_list, user_list)) == list(zip(user_list, user_list)) assert list(myzip(user_dict, user_dict)) == list(zip(user_dict, user_dict)) assert list(myzip(user_tuple, user_tuple)) == list(zip(user_tuple, user_tuple)) assert list(myzip(user_string, user_string)) == list(zip(user_string, user_string)) assert list(myzip(user_set, user_set)) == list(zip(user_set, user_set)) def bar(): global foo for i in range(10): foo += 1 yield i foo = 0 list(zip({1:2, 2:2, 3:3}, bar())) truezip_foo = foo foo = 0 list(myzip({1:2, 2:2, 3:3}, bar())) assert truezip_foo == foo

КулХацкеръ, Вы меня оставили без сна.

Добавлено через 16 минут
count забыл убрать. Он теперь не нужен.

Источник

Задание «свой zip»

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

1 2 3 4 5 6 7 8 9 10 11 12
def shortest_seq_range(string, tpl): return min(len(string), len(tpl)) syms_str = 'abcd' nums_tpl = (10, 20, 30, 40) pairs = ((syms_str[i_elem], nums_tpl[i_elem]) for i_elem in range(shortest_seq_range(syms_str, nums_tpl))) for i_elem in pairs: print(i_elem)

Современное решение проблемы «zip не является внутренней или внешней командой.»
import os import time # 1. Файлы и каталоги, которые необходимо скопировать, собираются в.

«zip» не является внутренней или внешней
Изучаю питон по книге "A byte of Python" Там разбирается задача по написанию программы, которая.

Создать родительский класс «Склад» и 3 подкласса («принтеры»,» сканеры», «ксероксы»)
Начните работу над проектом «Склад оргтехники». Создайте класс, описывающий склад. А также класс.

Эксперт функциональных языков программированияЭксперт Python

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
def my_zip(it1,it2): ite1=iter(it1) ite2=iter(it2) while True: v1=next(ite1) v2=next(ite2) yield (v1,v2) for a in my_zip([1,2,3],[11,22,33,44]): print(a) for a in my_zip("asdf","123456"): print(a) for a in my_zip(('a','b','c'),[1,2,3,4,5]): print(a)
line 10, in for a in my_zip([1, 2, 3], [11, 22, 33, 44]): RuntimeError: generator raised StopIteration
try: except StopIteration: return

Эксперт функциональных языков программированияЭксперт Python

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
def my_zip(it1,it2): ite1=iter(it1) ite2=iter(it2) try: while True: v1=next(ite1) v2=next(ite2) yield (v1,v2) except StopIteration: return for a in my_zip([1,2,3],[11,22,33,44]): print(a) for a in my_zip("asdf","123456"): print(a) for a in my_zip(('a','b','c'),[1,2,3,4,5]): print(a)

Catstail, не то. функция привязана к количеству аргументов. их может быть и 2 и 5. ну и цикл присутствует а по условию

ЦитатаСообщение от Zaouza Посмотреть сообщение

def myZip(*iterables): (*iterators,) = map(iter, iterables) while True: try: result = tuple(next(iterator) for iterator in iterators) yield result except RuntimeError: break print(*myZip([1, 2, 3], [11, 22, 33, 44]))

P. S. По идее надо перехватывать только StopIteration , а остальные — пробрасывать, но разбираться лениво.

Arsegg, так опять цикл while. вот что то кривое накидал может кто доведет до умного решения

1 2 3 4 5 6 7 8 9 10 11 12 13 14
def my_zip(*arg): list_ = list(map(iter, arg)) arg = list(map(list, arg)) try: res = tuple(map(lambda x : x.pop(0), arg)) yield res yield from my_zip(*arg) except: pass for a in my_zip({'a':1,'b':2,'c':3},[1,2,3,4,5],[3,4,5],"asdf"): print(a)

Добавлено через 8 минут
вторая строка не нужна. осталась от вариантов проб и ошибок

Добавлено через 1 минуту
чуть убрал лишнее

def my_zip(*arg): arg = list(map(list, arg)) try: yield tuple(map(lambda x : x.pop(0), arg)) yield from my_zip(*arg) except: pass

ЦитатаСообщение от Semen-Semenich Посмотреть сообщение

Вы создали аналог zip для второй версии Python. Если делать аналог третьей версии: нужно пилить генераторы (без создания списков).

ЦитатаСообщение от Arsegg Посмотреть сообщение

ЦитатаСообщение от Semen-Semenich Посмотреть сообщение

Я сам завис. Не совсем ясное условие. Даже пришлось смотреть сорцы zip ‘а на плюсах: ничего не понял — закрыл.

Добавлено через 1 минуту
Тут изначально в данных есть код, который без ошибок решает задачу создания своего аналога zip. Этот код надо преобразовать используя рекурсию функций, без циклов.

ЦитатаСообщение от Zaouza Посмотреть сообщение

Написать программу проверки правильности написания сочетаний «жи», «ши», «ча», «ща»
Помогите пожалуйста написать программу проверки правильности написания сочетаний "жи", "ши", "ча".

«zip» не является внутренней или внешней командой, исполняемой программой или пакетным файлом
Учусь по книге a byte of phyton,там есть пример кода: import os import time # 1. Файлы и.

Regex для примерно следующих вариантов: «45345», «1234.», «323233.1»
Помогите плиз c regex для примерного следующих вариантов: "45345", "1234..", "323233.1". Т.е.

Задание «Чтение данных с сайта»
Задание 1) Создайте словарь, где ключами будут названия телефонов из урока, а значениями будут.

Выполнить задание из темы «циклы»
Создайте список с пятью разными ингредиентами для бутерброда, наподобие: >>> ingredients = .

Задание «Чётное и нечётное»
Введи с клавиатуры несколько слов и сохрани их в список. Используя два отдельных цикла выведи все.

Источник

Оцените статью