python - 如何在 Python 3 中使用生成器管道?
问题描述
我正在努力提高我的能力并学习生成器管道。我设法解决了一些问题,但我觉得我的理解存在基本差距。
例如:我试图构建一个返回范围内所有数字的函数。以几个范围的字符串形式给出的范围。所以收到的字符串的一个例子:"1-2,4-4,8-10"
. 所以第一个生成器应该返回一个 int 对的列表:[1, 2] [4, 4] [8, 10]
第二个生成器应该在一个范围函数中使用1st_gen[0]
as start 和 the1st_gen[1]
作为 stop 并返回范围内的所有数字: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"))
解决方案
一些修复:
str.split()
返回一个列表,无需将其结果放入list
parse_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 ~ 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]
推荐阅读
- flutter - 如何使 PopupMenuItems 根据 TabBar 中的选项卡(如 WhatsApp)进行更改
- c# - 在 Azure 函数中从 Azure.Messaging.EventGrid 接收 EventGridEvent
- php - 仅在 WooCommerce 单品页面上的价格超过 10 美元时显示
- apache-kafka - 用于代理验证的 Kafka ssl ca 位置
- django - 仅允许父模型的所有者在使用通用视图时创建子模型(django-guardian)
- r - 应用 group_by 时保留 df 的所有变量并用日期汇总?
- node.js - 如何使用 mikro-orm 和 nestjs 获取左表数据
- postgresql - 如何使用 Powershell 脚本创建 PostgreSQL 数据库作为章鱼部署中的一个步骤
- sas - 在 SAS 中聚合两列中的数据
- javascript - 我如何使用它在我的页面中对数据进行排序的不同方式来处理这个 API?