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

получил это в курсе 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)]

Должно быть 2 генератора, т.е. 1 не подойдет? Кстати, вы используете цикл for в своем генераторе =]

Pontus Hultkrantz 13.12.2020 21:34

почему бы не повторить для каждого диапазона во втором?

Dani Mesejo 13.12.2020 21:34

или chain.from_iterable(range(j[0],j[1]) for j in first_generator)

Dani Mesejo 13.12.2020 21:36

@DaniMesejo Я бы предположил, что импорт itertools (или functools) будет запрещен в такой задаче.

AKX 13.12.2020 21:37

@AKX. Почему? Собеседование с работы подходит?

Dani Mesejo 13.12.2020 21:37

Также i for j in first_generator for i in range(j[0],j[1]) работает

Dani Mesejo 13.12.2020 21:38

Можете ли вы уточнить, с чем вы боретесь? Почему бы вам не применить range в первом цикле?

MisterMiyagi 13.12.2020 22:03

Спасибо всем за помощь! @MisterMiyagi, как бы вы решили это с помощью range() в первом цикле?

Ilani_Gi 14.12.2020 08:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
8
364
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ну, это так, но я бы не рекомендовал писать такой нечитаемый код...

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(), поэтому я узнал несколько новых вещей из вашего кода. Спасибо!

Ilani_Gi 14.12.2020 08:16

Мои два цента:

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]

Другие вопросы по теме