猿问

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

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

例如:我尝试构建一个返回某个范围内的所有数字的函数。范围以几个范围的字符串形式给出。收到的字符串的示例:"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

这是我的代码,我很乐意提供提高我的技能的提示:

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


慕后森
浏览 102回答 2
2回答

慕婉清6462132

一些修复:str.split()返回一个列表,无需将其结果放入listparse_ranges()不返回任何内容,为什么要打印它?range(int(4), int(4) + 1)不会回来,[4, 4]但只会[4]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=" ~ ")输出('~'作为分隔符添加,因此很清楚,产生的元素的“边界”在哪里):# yield from range(start, stop + 1)1 ~ 2 ~ 4 ~ 8 ~ 9 ~ 100 ~ 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]

慕少森

如果需要,您可以将流程拆分为任意多个生成器步骤,例如: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)用法:>>> list(get_numbers(get_ranges("1-2,4-4,8-10")))[1, 2, 4, 8, 9, 10]如果您确实愿意,您甚至可以将其拆分为更多步骤(拆分为多个部分,转换为数字,转换为范围对象,获取数字)。
随时随地看视频慕课网APP

相关分类

Python
我要回答