【问题标题】:Hardest python generator interview question - python generator object of ranges of numbers最难的python生成器面试题——数字范围的python生成器对象
【发布时间】:2026-01-04 12:25:01
【问题描述】:

在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 循环 =]
  • 为什么不在秒内对每个范围进行迭代?
  • chain.from_iterable(range(j[0],j[1]) for j in first_generator)
  • @DaniMesejo 我假设在这样的挑战中禁止导入 itertools(或 functools)。
  • @AKX。为什么?工作面试对吗?

标签: python function generator


【解决方案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]

【讨论】:

  • 我想这就是他们的意思......不知道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]

【讨论】: