嘿,我正在尝试在python中构建一组范围,如下所示:
给定(0.1, 0.2, 0.7)
我想构建[(0, 0.1), (0.1, 0.3), (0.3, 1)]
虽然这可以通过常规for循环轻松实现,但作为一项学习练习,我想看看是否可以通过set-builder表达式来实现。
我的第一个想法是做[(i, i+t) for i = 0, i+=t, t in (0.1, 0.2, 0.7)]
,但这不是有效的语法,我尝试了一些其他的表达式,但是我注意到不可能为表达式中的变量赋值。在查找信息时,似乎在list-builder表达式中,您可以同时遍历各种其他可迭代对象,但不能保持状态。
所以我想知道是否有可能以“pythonic”的方式做这样的事情。
答案 0 :(得分:3)
可能的解决方案是:
a = (0.1, 0.2, 0.7)
l = [(sum(a[:ii]), sum(a[:ii+1])) for ii, v in enumerate(a)]
然而,pythonic并不意味着最简洁,或者在任何可能的地方使用理解 - 如果一个简单的循环更具可读性,那就去吧(例如,如果没有其他因素暗示列表理解)。
答案 1 :(得分:2)
似乎只是循环是更多Pythonic的方式。写一个生成器函数:
def build_ranges(steps):
val = 0
for step in steps:
yield val, val + step
val += step
然后:
>>> input = (0.1, 0.2, 0.7)
>>> list(build_ranges(input))
[(0, 0.10000000000000001), (0.10000000000000001, 0.30000000000000004), (0.30000000000000004, 1.0)]