使用Python集合构建范围
嘿,我正在尝试在Python中构建一组范围,像这样:
给定 (0.1, 0.2, 0.7)
我想构建 [(0, 0.1), (0.1, 0.3), (0.3, 1)]
虽然通过普通的循环可以很容易做到这一点,但作为一个学习练习,我想看看是否可以通过集合生成表达式来实现。
我最开始的想法是这样写 [(i, i+t) for i = 0, i+=t, t in (0.1, 0.2, 0.7)]
,但是这个语法是错误的。我尝试了其他一些表达式,但我注意到在表达式内部不能给变量赋值。查找了一些信息后,我发现列表生成表达式可以同时遍历其他可迭代对象,但不能保持状态。
所以我想知道,是否有可能以一种“Pythonic”的方式做到这一点。
2 个回答
3
一个可能的解决方案是:
a = (0.1, 0.2, 0.7)
l = [(sum(a[:ii]), sum(a[:ii+1])) for ii, v in enumerate(a)]
不过,写出“pythonic”的代码并不意味着一定要写得最简洁,或者在任何地方都使用列表推导式。如果用简单的循环更容易理解,那就用循环(前提是没有其他因素暗示你应该用列表推导式,比如说)。
2
看起来直接用循环会更符合Python的风格。你可以写一个生成器函数:
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)]