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

15 浏览
0 Comments

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

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

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

应该返回:

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

是否有这样的函数?或者是否有类似的函数我可以参考?(如果它适用于列表也可以。)

0
0 Comments

这段代码展示了如何在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。

0
0 Comments

在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]

通过这个方法,我们可以获取给定长度的所有连续子范围。这对于处理列表数据非常有用,例如在数据分析或机器学习中。

0