Python负零切片

hyrbngr7  于 2023-02-28  发布在  Python
关注(0)|答案(5)|浏览(125)

我经常发现自己不得不处理序列中的最后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

我的问题是--有没有什么方法可以在不需要笨拙的特殊大小写的情况下获得这种行为?如果我不需要一直检查0,代码会简单得多。

ttisahbt

ttisahbt1#

只需使用or的合并行为。

>>> print 4 or None
4
>>> print -3 or None
-3
>>> print -0 or None
None

**解释(来自注解):**在您的示例中,如果len(b)0,则self.stack[:(-len(b) or None)]会简化为self.stack[:None],而0又会简化为self.stack[:]

q9rjltbz

q9rjltbz2#

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

>>> L = [1,2,3,4,5]
>>> L[len(L)-2:]
[4, 5]
>>> L[len(L)-0:]
[]
z5btuh9x

z5btuh9x3#

当你发现自己不止一次地使用一个结构时,把它变成一个函数。

def last(alist, n):
    if n:
        return alist[:-n]
    return alist

newstack = last(self.stack, len(b)) + a

EOL在评论中建议的更简单的版本:

def last(alist, n):
    return alist[:-n] if n else alist[:]
nr9pn0ug

nr9pn0ug4#

这可能是可怕的效率低下,由于双重颠倒,但希望有一些东西的想法,颠倒顺序,使索引更容易:

a = [11, 7, 5, 8, 2, 6]

def get_last_n(seq, n):
    back_seq = seq[::-1]
    select = back_seq[:n]
    return select[::-1]

print(get_last_n(a, 3))
print(get_last_n(a, 0))

退货:

[8, 2, 6]
[]
11dmarpk

11dmarpk5#

你可以在里面加个条件句

L[-i if i else len(L):]

我认为这个版本不太清楚。你应该沿着旁边加上评论

L[-i or len(L):]

相关问题