Python 反向切片
我问题的具体例子是,“我怎么才能在这个例子中得到‘3210’?”
>>> foo = '0123456'
>>> foo[0:4]
'0123'
>>> foo[::-1]
'6543210'
>>> foo[4:0:-1] # I was shooting for '3210' but made a fencepost error, that's fine, but...
'4321'
>>> foo[3:-1:-1] # How can I get '3210'?
''
>>> foo[3:0:-1]
'321'
我觉得很奇怪的是,我可以写 foo[4:0:-1]、foo[5:1:-1] 等等,得到我想要的结果,但没有办法写出一个切片来直接得到‘3210’。
一种临时的解决办法是 foo[0:4][::-1],但这样会在过程中创建两个字符串对象。我需要进行这个操作的次数多达数十亿次,所以每一次字符串操作都很耗费资源。
我一定是漏掉了什么简单又容易的东西。谢谢你的帮助!
8 个回答
8
如果你想要一种比复杂的切片表示法更容易理解的方式:
>>> foo = '0123456'
>>> ''.join(reversed(foo[0:4]))
'3210'
11
在你的切片表示法中省略结束索引:
>>> foo = '0123456'
>>> foo[3::-1]
'3210'
如果你需要这样做很多次,可以创建一个切片对象,这样就可以反复使用了。
>>> first_4_items_reversed = slice(3,None,-1)
>>> foo[first_4_items_reversed]
'3210'
50
简单来说,就是把结束范围的索引排除在外...
>>> foo[3::-1]
'3210'
有趣的是,我觉得你几乎唯一没尝试的选项就是这个。