python正向切片_使Python切片正常(正/正向+无无+无负索引+在边界内)

在Python中实现可以用标准Python语法进行切片的类(即负索引、单步执行等)时,有时可以将切片转换为“理智的、向前的切片”,以确定切片的元素。怎样才能以简洁/优雅的形式写出这样一个函数呢?在

对于“理智的、向前的切片”,我指的是一个与初始切片等效的切片,在这个意义上,结果元素是相同的,但是有一个正步长,没有负索引,也没有大于对象长度的索引。在

示例(假设数组长度为10):slice(None, 4,None) -> slice( 0, 4, 1)

slice( -7, 12, 1) -> slice( 3,10, 1)

slice(None,None, -1) -> slice( 0,10, 1)

slice( 7, 3, -2) -> slice( 5, 8, 2)

slice( 9, 1, -3) -> slice( 3,10, 3)

编写一个执行这种转换的函数并不是非常困难,但我不能编写得简洁明了。尤其是在将“向后切片”转换为等效的“向前切片”时确定起始索引似乎相当麻烦。在

工作示例:

^{pr2}$

.

.

. 在

编辑(最终功能):

通过使用slice.indices(),@doublep善意地指向我,它变成了:def to_sane_slice(s, N):

# get rid of None's, overly large indices, and negative indices (except -1 for

# backward slices that go down to first element)

start, stop, step = s.indices(N)

# get number of steps & remaining

n, r = divmod(stop - start, step)

if n < 0 or (n==0 and r==0):

return slice(0,0,1)

if r != 0: # its a "stop" index, not an last index

n += 1

if step < 0:

start, stop, step = start+(n-1)*step, start-step, -step

else: # step > 0, step == 0 is not allowed

stop = start+n*step

stop = min(stop, N)

return slice(start, stop, step)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值