【问题标题】:Iterating over a Python generator迭代 Python 生成器
【发布时间】:2020-01-08 18:46:29
【问题描述】:

我正在尝试编写一个函数,它将一串间隔作为输入,例如 "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")))

【问题讨论】:

    标签: python python-3.x generator


    【解决方案1】:
    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”表达式。 (另外,请注意,您需要将每个范围的“到”端扩展 +1,因为范围端点不包含在内。)

    【讨论】:

      【解决方案2】:

      您似乎缺少的两部分是: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
      %
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-01
        • 2018-05-16
        • 2018-06-04
        • 1970-01-01
        • 1970-01-01
        • 2015-02-10
        • 1970-01-01
        相关资源
        最近更新 更多