生成连续值对之间的范围

时间:2014-06-12 21:22:03

标签: python

说我有一个清单:

my_array = np.array([0, 5, 12, 18, 23])

我想在上面列表的连续对之间生成一个范围列表,即:

[range(0,5), range(5,12), range(12, 18), range(18, 23)]

有没有简单的方法来构建这些范围?也许是一种更加Pythonic的方式,而不是明确地循环?

3 个答案:

答案 0 :(得分:5)

怎么样:

Python 2变体:

>>> lst = [0, 5, 12, 15]
>>> map(range, lst[:-1], lst[1:])
[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9, 10, 11], [12, 13, 14]]

Python 3变体:

与在Python 3中一样,maprange和许多其他函数不返回列表,但是迭代器,我们可能需要修改调用以获取列表:

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

你可以:

>>> for itm in map(range, lst[:-1], lst[1:]):
       print (itm)
range(0, 5)
range(5, 12)
range(12, 15)

答案 1 :(得分:3)

您可以使用list comprehensionzip

my_range = np.array([range(i, j) for i, j in zip(my_array[:-1], my_array[1:])])
# array([range(0, 5), range(5, 12), range(12, 18), range(18, 23)], dtype=object)

答案 2 :(得分:1)

使用有用的函数从迭代中返回成对元素,它变得非常简单。

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