#python #function #generator
#python #функция #генератор
Вопрос:
получил это в курсе python, до сих пор не могу понять:
Ввод — строка начальной и конечной точек a желаемого диапазона.
Вывод — генератор чисел, содержащий все числа во всех диапазонах.
Проблема: создание функции с использованием только двух выражений генераторов (без циклов for).
Пример:
Ввод:
list(parse_ranges("1-2,4-4,8-10"))
Желаемый результат:
[1, 2, 4, 8, 9, 10]
к чему я пришел до сих пор:
def parse_ranges(ranges_string):
first_generator = ([int(i[0]),int(i[-1])] for i in ranges_string.split(','))
second_generator = (range(j[0],j[1]) for j in first_generator)
return second_generator
мой вывод:
[range(1, 2), range(4, 4), range(8, 0)]
Комментарии:
1. Это должно быть 2 генератора, т.Е. 1 не подойдет? Bt wyou используете цикл for в своем генераторе =]
2. почему бы не выполнить итерацию для каждого диапазона во втором?
3. или
chain.from_iterable(range(j[0],j[1]) for j in first_generator)
4. @DaniMesejo Я бы предположил, что импорт
itertools
(илиfunctools
) будет запрещен в подобной задаче.5. @AKX. Почему? Правильно ли проводить собеседование с места работы?
Ответ №1:
Что ж, это делает это, но я бы не рекомендовал писать такой нечитаемый код…
def parse_ranges(string):
ranges = (tuple(map(int, (s.split('-')))) for s in string.split(','))
return (x for r in ranges for x in range(r[0], r[1] 1) )
list(parse_ranges("1-2,4-4,8-10"))
# [1, 2, 4, 8, 9, 10]
Комментарии:
1. Я думаю, это то, что они имели в виду … не знал о
map()
функции, поэтому я узнал несколько новых вещей из вашего кода. Спасибо!
Ответ №2:
Мои два цента:
s = "1-2,4-4,8-10"
def parse_ranges(s):
ranges = ((int(start), int(stop) 1) for start, stop in (chunk.split('-') for chunk in s.split(',')))
yield from (i for start, end in ranges for i in range(start, end))
print(list(parse_ranges(s)))
Вывод
[1, 2, 4, 8, 9, 10]