首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >遍历Python生成器

遍历Python生成器
EN

Stack Overflow用户
提问于 2020-01-09 02:46:30
回答 2查看 84关注 0票数 0

我正在尝试编写一个函数,它将接受一个间隔字符串作为输入,例如"0-0,4-8,20-21,43-45",以生成每个范围内的所有数字,意思是:[0, 4, 5, 6, 7, 8, 20, 21, 43, 44, 45]

本练习需要使用生成器来完成此操作。我设法通过生成器解析了输入,但是我不能用同样的方法来填充数字。我正在尝试int()每个数字,这样我就可以利用range()来生成边缘内的所有数字。

这是我的概念代码-如何在每个间隔内生成数字?

代码语言:javascript
复制
def parse_ranges(arg):
    arg = arg.split(",")
    parsed= (line.split("-") for line in arg)

    #Trying to parse each character to int to use range()
    intervals= (int(i) for i in number for number in parsed)

    # Even if I had the characters parsed to int, I still don't know how to produce the range
    ranges = (range(interval[0],interval[1]) interval for interval in intervals)
    return ranges

print(list(parse_ranges("0-0,4-8,20-21,43-45")))
EN

回答 2

Stack Overflow用户

发布于 2020-01-09 03:47:32

代码语言:javascript
复制
def parse_ranges(arg):
    arg = arg.split(",")
    parsed = ((line.split("-")) for line in arg)

    for pair in parsed:
        yield from range(int(pair[0]), int(pair[1])+1)

print(list(parse_ranges("0-0,4-8,20-21,43-45")))

Out: [0, 4, 5, 6, 7, 8, 20, 21, 43, 44, 45]

如果您希望将来自另一个生成器内部的生成器的值直接传递到外部生成器的消费者,则需要使用"yield from“表达式。(另外,请注意,您需要将每个范围的" to“末尾扩展+1,因为范围端点不包括在内。)

票数 2
EN

Stack Overflow用户

发布于 2020-01-09 03:47:39

您似乎遗漏了两个部分:range()的第二个参数需要超出您的期望;您可以通过yield from将控制从一个生成器传递给另一个生成器

代码语言:javascript
复制
def parse_ranges(arg):
    for start, stop in (interval.split('-') for interval in arg.split(',')):
        yield from range(int(start), int(stop) + 1)

print(*parse_ranges("0-0,4-8,20-21,43-45"))

输出

代码语言:javascript
复制
% python3 test.py
0 4 5 6 7 8 20 21 43 44 45
%
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59652070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档