遍历Python生成器

时间:2020-01-08 18:46:29

标签: python python-3.x generator

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

练习需要使用生成器来执行。我设法通过生成器来解析输入,但是对于填充数字却无法做到相同。我正在尝试int()的每个数字,以便可以利用range()来生成边缘内的所有数字。

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

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")))

2 个答案:

答案 0 :(得分:2)

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。)

答案 1 :(得分:0)

您似乎缺少的两个部分是:range()的第二个参数必须是您想要的第二个参数;您可以通过yield from将控制权从一台发电机传递给另一台发电机:

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"))

输出

% python3 test.py
0 4 5 6 7 8 20 21 43 44 45
%