从断点列表中完全枚举范围

时间:2016-02-25 19:51:14

标签: python

这是一个python 101问题,但我想不出一种pythonic方法来枚举这些断点之间所有整数的断点列表。

说我有:

<span 
    class="standalone-tt badge badge-sm badge-plain" 
    data-toggle="tooltip" 
    data-placement="right" 
    title="Tooltip on right" 
 >Admin Mode</span>

我想要

<script>
    // Initialize MY standalone tooltips, ignoring INSPINIA-affected elements
    $(document).ready(function () 
        {
            $('.standalone-tt').tooltip();
        }
    );
</script>

(我的实际用例涉及多年的断点;我想要在每个范围内的所有年份)。 我可以使用计数器遍历breaks = [4, 7, 13, 15, 18] ,为每个间隔创建一个enumerated = [[4,5,6],[7,8,9,10,11,12],[13,14],[15,16,17],[18]] 并将其存储在列表中,但我怀疑这种枚举有一个简单的单行程。效率是一个问题,因为我正在处理数百万条记录。

3 个答案:

答案 0 :(得分:4)

您可以使用zip

>>> enumerated = [range(start, end) for start,end in zip(breaks, breaks[1:])] + [[breaks[-1]]]
>>> enumerated
[[4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14], [15, 16, 17], [18]]

在偏移量为1(zip(breaks, breaks[1:])的情况下使用自身压缩列表是获得所有对的已知“技巧”。这会丢掉最后一个,所以我手动添加了它。

答案 1 :(得分:1)

你可以创建一个生成器,它将具有内存效率:

def f(b):
    if not b:
        raise StopIteration
    x = b[0]
    for y in b[1:]:
        yield xrange(x, y)
        x = y
    yield [y]

print list(f(breaks))

答案 2 :(得分:0)

您可以使用简单的列表理解和range()

breaks = [4, 7, 13, 15, 18]
new = [range(breaks[i],breaks[i+1]) for i in xrange(len(breaks)-1)]+[[breaks[-1]]]
print new

[[4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14], [15, 16, 17]]