首先:我确实读过 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* 数组或在前面和后面添加多个元素以本质上“填充”它。
但是,这种类型的答案会消耗一点内存,并且当我们想要将其折叠很多次时就无法工作。
考虑以下因素,
# 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]),那就更好了。
最佳答案
不使用过多内存的解决方案如下
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
def get_sequences(a_list, sequence_length):
sequences = []
for i in range(len(my_list)):
sequences.append("".join(str(my_list[(x + i) % len(my_list)]) for x in range(sequence_length)))
return sequences
print(get_sequences(my_list, 2))
print(get_sequences(my_list, 3))
将输出
['12', '23', '34', '45', '56', '67', '78', '89', '91']
['123', '234', '345', '456', '567', '678', '789', '891', '912']
这很好,因为它在任何地方都可以利用生成器。
关于python - 如何在 Python 中包裹字符串或数组并对包裹的字符串或数组进行切片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48625812/