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

2024-06-23 20:09:55 发布

您现在位置:Python中文网/ 问答频道 /正文

这有点像python101的问题,但我想不出一种pythonic的方法来枚举断点列表,其中包含断点之间的所有整数。你知道吗

假设我有:

breaks = [4, 7, 13, 15, 18]

我想要

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

(我的实际用例涉及的断点是年;我想要每个范围内的所有年)。 我可以用一个计数器循环breaks,为每个间隔创建一个range,并将其存储在一个列表中,但我怀疑这种枚举有一个简单的单行程序。效率是一个问题,因为我与数以百万计的记录工作。你知道吗


Tags: 方法程序列表间隔计数器range整数用例
3条回答

您可以使用简单的列表理解和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]]

你可以用拉链

>>> 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:])的列表压缩是获得所有对的已知“技巧”。这会删除最后一个,所以我手动添加了它。你知道吗

您可以创建一个生成器,它将节省内存:

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))

相关问题 更多 >

    热门问题