Самый сложный вопрос интервью с генератором python — объект генератора python диапазонов чисел

#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]