获取Python中给定长度的所有连续子范围
这段代码展示了如何在python中获取给定长度的所有连续子范围。使用zip函数可以实现这个功能。具体方法是将原列表和原列表的切片进行zip操作,切片的长度为给定的长度减一。例如,对于列表l=(0,1,2,3,4,5),可以使用zip(l,l[1:],l[2:])来获取长度为3的所有连续子范围[(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次循环,最好的结果是:4.47微秒每次循环
:~$ python -m timeit "l=(0,1,2,3,4,5);[l[i: i + 3] for i in range(len(l) - 3 + 1)]"
1000000次循环,最好的结果是:0.632微秒每次循环
:~$ python -m timeit "l=(0,1,2,3,4,5);zip(l,l[1:],l[2:])"
1000000次循环,最好的结果是:0.447微秒每次循环
对于长列表和大的切片,可以使用itertools模块中的izip和islice函数:
zip_longest(*(islice(l, i) for i in range(n))) # 在Python 3中
izip(*(islice(l, i) for i in xrange(n))) # 在Python 2中
对于n大小的窗口的一般化解决方案是:zip(*(l[i:] for i in range(n))),在Python 2.x中可以使用xrange代替range。此外,基准测试存在问题,因为它包括了导入时间。
在处理长列表时,使用izip比较高效!对于长列表和大的n,使用izip(*(islice(l, i) for i in range(n)))是一种内存高效的解决方案(在Python 3中可以直接使用zip)。
在Python 2.x中,应该使用xrange而不是range。
在Python中,有时候我们需要获取一个给定长度的连续子范围。例如,在一个列表中,我们想要获取长度为3的所有连续子范围。下面是一个解决这个问题的方法:
我们可以使用切片操作来获取所有合适的列表切片。首先,我们定义一个范围r,长度为6。然后,我们定义一个变量n,表示子范围的长度为3。接下来,我们使用一个for循环来遍历范围r的索引。在每次迭代中,我们使用切片操作来获取从当前索引开始,长度为n的子范围。最后,我们打印出每个子范围。
下面是实现这个方法的代码:
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]
通过这个方法,我们可以获取给定长度的所有连续子范围。这对于处理列表数据非常有用,例如在数据分析或机器学习中。