获取python中给定长度的所有连续子范围

时间:2015-04-26 18:24:32

标签: python list range

我需要一个给定范围的函数,它产生指定顺序的所有子范围(在列表或元组中)。例如:

my_function((0,1,2,3,4,5), 3)

应该给:

[(0,1,2),(1,2,3),(2,3,4),(3,4,5)].

有这样的功能吗?或者我可以从哪个类似的东西开始? (如果它适用于列表,那也没关系。)

2 个答案:

答案 0 :(得分:2)

您可以采取所有适当的列表切片:

r = range(6)
n = 3
for i in range(len(r) - n + 1):
    print r[i: i + n]

输出:

[0, 1, 2]
[1, 2, 3]
[2, 3, 4]
[3, 4, 5]

答案 1 :(得分:2)

您可以使用zip功能:

String

以下基准测试显示,使用>>> l=(0,1,2,3,4,5) >>> zip(l,l[1:],l[2:]) [(0, 1, 2), (1, 2, 3), (2, 3, 4), (3, 4, 5)] zip更快或简单列表理解:

islice

正如对长列表和大切片的评论所述,您可以使用:~$ python -m timeit "l=(0,1,2,3,4,5);from itertools import islice;[list(islice(l, i, i + 3)) for i in range(len(l) - 3 + 1)]" 100000 loops, best of 3: 4.47 usec per loop :~$ python -m timeit "l=(0,1,2,3,4,5);[l[i: i + 3] for i in range(len(l) - 3 + 1)]" 1000000 loops, best of 3: 0.632 usec per loop :~$ python -m timeit "l=(0,1,2,3,4,5);zip(l,l[1:],l[2:])" 1000000 loops, best of 3: 0.447 usec per loop 模块中的izipislice函数:

itertools