使用python set-builder表示法构建范围

时间:2011-02-15 22:52:59

标签: list set python

嘿,我正在尝试在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”的方式做这样的事情。

2 个答案:

答案 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)]