python

时间:2019-01-14 20:56:14

标签: python list numpy

假设我有一个列表

a=[0,1,2,3,4,5,6,7,8,9]

我随机选择一个索引,

i = np.random.choice(np.arange(a.size))

现在,我想在某个大小的i周围选择一个对称间隔,例如2。因此对于给定的列表,如果选择了索引i = 5,我将得到类似

print(a[i-2:i+2+1])
>> [3, 4, 5, 6, 7]

这很好 但是,如果我恰好在端点之一附近,i = 1。使用我所拥有的,

print(a[i-2:i+2+1])
>> []

相反,我希望它打印不对称的间隔,例如[0, 1, 2, 3]

如果i = 8

print(a[i-2:i+2+1])
>> [6, 7, 8, 9] 
就像我也想要

一样,因此接近终点似乎无关紧要。我最接近解决方案的是(假设i = 1)

print([a[0:i+3] if a[i-2:i+2+1] == [] else a[i-2:i+2+1] ])
>> [[0, 1, 2, 3]]

但这返回[[0,1,2,3]]而不是[0,1,2,3]

在python / numpy中使用列表推导或其他方法是否有很好的方法?

3 个答案:

答案 0 :(得分:0)

您只需要将较低的索引剪裁为零:

>>> print(a[max(i-2,0):i+2+1])
[0, 1, 2, 3]

没有这个,它就会变成负数。这在切片时有特殊含义:负索引从列表的 end 开始计数。

答案 1 :(得分:0)

您已经跳过了Python的右端编号。您给了它极限[-1:3],但是-1表示右边的元素。由于“第一个”元素位于“最后一个”元素之后,因此结果切片为0。在高索引上不会出现此问题,因为那一端没有“环绕”。

使用max只需将较低的索引驱动到0的轨道。

print(a[max(i-2, 0)]:i+2+1])

答案 2 :(得分:0)

问题在于,当您退出列表边界时,它将返回一个空列表。试试:

a=[0,1,2,3,4,5,6,7,8,9]
i = 1
interval=2
print( a[ max(i-2, 0) : min(i+2+1, len(a)) ] )

我只是在上面设置了最大/最小界限,所以它不会逃避它。不是很pythonic,但这是一个快速修复。