python - 最难的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)]
解决方案
好吧,就是这样,但我不建议编写这样不可读的代码......
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]
推荐阅读
- android - 错误:找不到参数[目录'libs']的方法实现()
- javascript - chrome-extension:// 页面内的 Chrome 扩展
- c - C语言的while循环中的++i和i++
- python-sphinx - 'make' 不是内部或外部命令、可运行程序或批处理文件。[狮身人面像]
- javascript - 材质 UI - TreeView 数据结构
- design-patterns - 避免循环引用的设计模式
- postgresql - 如何将“created_timestamp”:1553678246 转换为日期 dd:mm:yyyy 格式
- javascript - 一些书签不在 iOS 上执行:如何调试?
- arrays - 在 Angular 中将数组转换为对象
- c# - 无法使用 C# 和 ADO.NET 添加到数据库