这是一个 python 101 问题,但我想不出一种 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
并将其存储在列表中,但我怀疑这种枚举有一个简单的单行代码。效率是一个问题,因为我正在处理数百万条记录。
您可以使用 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]]
使用一个列表的压缩,其自身偏移量为一(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))
您可以使用简单的列表理解和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]]