получил это в курсе Python, до сих пор не могу понять:
Входные данные - строка начальной и конечной точек желаемого диапазона.
Выход — генератор чисел, содержащий все числа во всех диапазонах.
Проблема: сделать функцию, используя только два выражения генератора (без циклов 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)]
почему бы не повторить для каждого диапазона во втором?
или chain.from_iterable(range(j[0],j[1]) for j in first_generator)
@DaniMesejo Я бы предположил, что импорт itertools
(или functools
) будет запрещен в такой задаче.
@AKX. Почему? Собеседование с работы подходит?
Также i for j in first_generator for i in range(j[0],j[1])
работает
Можете ли вы уточнить, с чем вы боретесь? Почему бы вам не применить range
в первом цикле?
Спасибо всем за помощь! @MisterMiyagi, как бы вы решили это с помощью range()
в первом цикле?
Ну, это так, но я бы не рекомендовал писать такой нечитаемый код...
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]
Я думаю, это то, что они имели в виду ... не знал о функции map()
, поэтому я узнал несколько новых вещей из вашего кода. Спасибо!
Мои два цента:
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]
Должно быть 2 генератора, т.е. 1 не подойдет? Кстати, вы используете цикл for в своем генераторе =]