Python 在连续值对之间生成范围
假设我有一张清单:Python 在连续值对之间生成范围,python,Python,假设我有一张清单: my_array = np.array([0, 5, 12, 18, 23]) 我想在上述列表的连续对之间生成一个范围的列表,即: [range(0,5), range(5,12), range(12, 18), range(18, 23)] 有没有一个简单的方法来建立这些范围?也许是一种更具python风格的方法,它不需要显式循环?您可以使用and 使用一个有用的函数从iterable返回两两元素,这相当简单 import numpy as np from itert
my_array = np.array([0, 5, 12, 18, 23])
我想在上述列表的连续对之间生成一个范围的列表,即:
[range(0,5), range(5,12), range(12, 18), range(18, 23)]
有没有一个简单的方法来建立这些范围?也许是一种更具python风格的方法,它不需要显式循环?您可以使用and
使用一个有用的函数从iterable返回两两元素,这相当简单
import numpy as np
from itertools import islice, tee
def pairwise(iterable, n=2):
return zip(*(islice(it, pos, None) for pos, it in enumerate(tee(iterable, n))))
my_array = np.array([0, 5, 12, 18, 23])
myranges = [range(i,j) for i,j in pairwise(my_array)]
print(myranges)
#[range(0, 5), range(5, 12), range(12, 18), range(18, 23)]
那么:
Python 2变体:
Python 3变体:
与Python 3一样,map
、range
和许多其他函数不返回列表,而是返回迭代器,我们可能需要修改调用以获取列表:
>>> list(map(list, map(range, lst[:-1], lst[1:])))
[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9, 10, 11], [12, 13, 14]]
但是,如果您对范围迭代器列表很满意:
>>> list(map(range, lst[:-1], lst[1:]))
[range(0, 5), range(5, 12), range(12, 15)
Python 2样式返回类型为map
的实例,这与迭代器非常接近:
>>> map(range, lst[:-1], lst[1:])
<map at 0x7faa5b15c6d8>
请注意,这在Python3中的行为与Python2演示中显示的稍有不同。它可能仍能满足提问者的需求,但会有所不同。在Python3中,
map
是一个生成器,range
返回一个iterable对象而不是列表。
>>> list(map(range, lst[:-1], lst[1:]))
[range(0, 5), range(5, 12), range(12, 15)
>>> map(range, lst[:-1], lst[1:])
<map at 0x7faa5b15c6d8>
>>> for itm in map(range, lst[:-1], lst[1:]):
print (itm)
range(0, 5)
range(5, 12)
range(12, 15)