python中列表的窗口选择

2024-04-18 21:18:21 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一张单子

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中,有没有一种很好的方法可以使用列表理解或其他方法来实现这一点?你知道吗


Tags: 方法利用列表size间隔ifnprandom
3条回答

您已经跳过了Python的右端编号。你给了它限制[-1:3],但是-1表示右边的元素。因为“first”元素超过了“last”元素,所以得到的切片是0。在高指数上你不会有这个问题,因为在这一端没有“环绕”。你知道吗

只需使用max将较低的索引设置为0。你知道吗

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

你只需要把下面的索引剪辑成0:

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

如果没有这个,它会变成负数。这在切片中有特殊的意义:负索引从列表的开始计数。你知道吗

问题是,当您退出列表的边界时,它返回一个空列表。尝试:

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

我只是给它设置了最大/最小界限,这样它就不会逃逸了。不是很像Python,但这是一个快速解决办法。你知道吗

相关问题 更多 >