【发布时间】:2018-07-15 12:00:49
【问题描述】:
在任何事情之前:我确实阅读了Wrapping around a python list as a slice operation 和wrapping around slices in Python / numpy
这个问题与这两个问题中的任何一个都不是重复的,因为这个问题是一个完全不同的问题。因此,请停止投票,不要将其标记为重复。在第一个提到的线程中,那里的“包装”意味着不同的东西。对于第二个提到的线程,他们处理的是 ndarray 并且只能用于整数。
真正的问题: 如何将字符串或数组从一个点切片到另一个点,并在它们之间有一个端点?
本质上,我们想做这样的事情,
n = whatever we want
print(string[n-5:n+6])
上面的代码可能看起来很正常。但它在边缘附近不起作用(靠近字符串/数组的开头或字符串/数组的结尾)。因为 Python 的切片不允许从数组的末尾切片并从头开始。如果 n 小于 5 或字符串长度大于 n+6 怎么办?
这是一个更好的例子,考虑到我们有
array = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k']
我们想为数组中的所有元素打印一个元素及其最近的两个邻居字符串
print("Two neighbors:")
for i, x in enumerate(array):
print(array[i-1] + array[i] + array[(i+1)%len(array)])
输出:
Two neighbors:
kab
abc
bcd
cde
def
efg
fgh
ghi
hij
ijk
jka
到目前为止一切顺利,让我们和四个邻居一起做吧。
print("Four neighbors:")
for i, x in enumerate(array):
print(array[i-2] + array[i-1] + array[i] + array[(i+1)%len(array)] + array[(i+2)%len(array)])
输出:
Four neighbors:
jkabc
kabcd
abcde
bcdef
cdefg
defgh
efghi
fghij
ghijk
hijka
ijkab
您可以看到这是怎么回事,随着所需邻居数量的增加,我们必须逐一输入它们的次数增加。
有没有办法代替s[n-3]+s[n-2]+s[n-1]+s[n]+s[n+1]+s[n+2]+s [n+3],我们可以做类似 s[n-3:n+4] 的事情吗?
请注意,s[n-3:n]+s[n:(n+4)%len(s)] 在边缘不起作用。
注意:
对于上面的特定示例,可以做一个 3*array 或在前面和后面添加一些元素以基本上“填充”它。
但是,这种类型的答案会占用一些内存,并且当我们想要将其折叠很多次时无法工作。
考虑以下,
# len(string) = 10
# n = 0 or any number we want
print(string[n-499:n+999])
如果开始和结束索引可以灵活而不是相互镜像(例如,string[n-2:n+9] 而不是 string[n-3:n+4]),那就更好了。
【问题讨论】:
-
我会这样做: (3*array)[len(array)+ni:len(array)+n+i+1] 其中 n 是中间索引,i 是每边所需的邻居数。
-
@BUZZY 我做了几乎相同的解决方法,只需在开头和结尾添加 i 数字,然后将 i 添加到所需的索引。这样可以节省更多内存。但是你和我的解决方法都不够 Pythonic。