Python负零切片

Ant*_*ony 5 python idioms slice

我经常发现自己必须处理序列中的最后n个项目,其中n可能为0.问题是尝试切片时[-n:]将不起作用n == 0,因此需要笨拙的特殊情况代码.例如

if len(b): 
    assert(isAssignableSeq(env, self.stack[-len(b):], b))
    newstack = self.stack[:-len(b)] + a
else: #special code required if len=0 since slice[-0:] doesn't do what we want
    newstack = self.stack + a
Run Code Online (Sandbox Code Playgroud)

我的问题是 - 有没有办法在不需要笨拙的特殊套管的情况下获得这种行为?如果我不必一直检查0,代码会简单得多.

Ign*_*ams 12

只是使用or合并行为.

>>> print 4 or None
4
>>> print -3 or None
-3
>>> print -0 or None
None
Run Code Online (Sandbox Code Playgroud)

  • `self.stack[:(-len(b) or None)]` 减少为 `self.stack[:None]` 如果 `len(b)` 为 0,然后减少到 `self.stack[:] `,这与`else` 子句中的表达式非常接近(但不完全相同)。 (5认同)
  • 我不明白这与这个问题有什么关系。 (3认同)
  • 使用None适用于切片的末尾,但是从一开始呢?stack [None:]仍然给出了整个列表. (2认同)
  • 然后在那里合并一个不同的价值.说,`len(self.stack)`. (2认同)
  • 那时你也可以使用`len(self.stack)-n`(你将使用`或`输入更多内容). (2认同)

jam*_*lak 11

您可以将其切换L[-2:]L[len(L)-2:]

>>> L = [1,2,3,4,5]
>>> L[len(L)-2:]
[4, 5]
>>> L[len(L)-0:]
[]
Run Code Online (Sandbox Code Playgroud)