说我有一个清单:
my_array = np.array([0, 5, 12, 18, 23])
我想在上面列表的连续对之间生成一个范围列表,即:
[range(0,5), range(5,12), range(12, 18), range(18, 23)]
有没有简单的方法来构建这些范围?也许是一种更加Pythonic的方式,而不是明确地循环?
答案 0 :(得分:5)
怎么样:
>>> 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中一样,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>
你可以:
>>> for itm in map(range, lst[:-1], lst[1:]):
print (itm)
range(0, 5)
range(5, 12)
range(12, 15)
答案 1 :(得分:3)
您可以使用list comprehension和zip。
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)]