假设我有一个列表
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中使用列表推导或其他方法是否有很好的方法?
答案 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,但这是一个快速修复。