首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Python 3中使用生成器管道?

如何在Python 3中使用生成器管道?
EN

Stack Overflow用户
提问于 2020-10-07 05:56:09
回答 2查看 264关注 0票数 0

我在努力提高我的能力,学习发电机管道。我设法解决了一些问题,但我觉得我有一个基本的差距,在我的理解。

例如:我试图构建一个返回范围内所有数字的函数。以几个范围的字符串表示的范围。因此,接收到的字符串的一个示例是:"1-2,4-4,8-10"。因此,第一个生成器应该返回一个int对列表:[1, 2] [4, 4] [8, 10]和第二个生成器应该在范围函数中使用1st_gen[0]作为开始,使用1st_gen[1]作为停止,并返回范围内的所有数字:1 2 4 8 9 10

这是我的代码,我很乐意得到一些技巧来提高我的技能:

代码语言:javascript
运行
复制
def parse_ranges(range_string):
    temp_list = (c.replace("-", ",") for c in list(range_string.split(",")))
    generator2 = (i for start, stop in temp_list for i in range(int(start), int(stop) + 1))
    for i in generator2:
        print(i)

print(parse_ranges("1-2,4-4,8-10"))
print(parse_ranges("0-0,4-8,20-21,43-45"))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-07 06:33:45

一些解决办法:

  • str.split()返回一个列表,不需要将其结果放入list
  • parse_ranges()中不返回任何内容,为什么打印it?
  • range(int(4), int(4) + 1)不会返回[4, 4],而只返回[4]

代码语言:javascript
运行
复制
def parse_ranges(range_string):
    temp = (map(int, c.split("-")) for c in range_string.split(",")) 

    # yield all the numbers (yield from 'flattens' the result)
    for start, stop in temp:
        yield from range(start, stop + 1)

    # or to yield lists 
    # for start, stop in temp:
    #     yield list(range(start, stop + 1))

print(*parse_ranges("1-2,4-4,8-10"), sep=" ~ ")
print(*parse_ranges("0-0,4-8,20-21,43-45"), sep=" ~ ")

输出(添加了'~'作为分隔器,这样就可以清楚地看到生成元素的“边框”):

代码语言:javascript
运行
复制
# yield from range(start, stop + 1)
1 ~ 2 ~ 4 ~ 8 ~ 9 ~ 10
0 ~ 4 ~ 5 ~ 6 ~ 7 ~ 8 ~ 20 ~ 21 ~ 43 ~ 44 ~ 45

# yield list(range(start, stop + 1))
[1, 2] ~ [4] ~ [8, 9, 10]
[0] ~ [4, 5, 6, 7, 8] ~ [20, 21] ~ [43, 44, 45]
票数 2
EN

Stack Overflow用户

发布于 2020-10-07 09:41:01

如果您愿意,您可以根据需要将流程分割成任意多个生成器步骤,例如:

代码语言:javascript
运行
复制
def get_ranges(string):
    for part in string.split(","):
        yield [int(number) for number in part.split("-")]

def get_numbers(ranges):
    for start, stop in ranges:
        yield from range(start, stop + 1)

用法:

代码语言:javascript
运行
复制
>>> list(get_numbers(get_ranges("1-2,4-4,8-10")))
[1, 2, 4, 8, 9, 10]

如果你真的想要的话,你甚至可以把它分成更多的步骤(分成几个部分,转换成数字,转换成范围对象,得到数字)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64238012

复制
相关文章

相似问题

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