10

我经常发现自己不得不处理序列中的最后 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,代码会简单得多。

4

5 回答 5

16

只需使用or' 的合并行为。

>>> print 4 or None
4
>>> print -3 or None
-3
>>> print -0 or None
None
于 2012-07-05T04:45:14.830 回答
16

你可以把它L[-2:]L[len(L)-2:]

>>> L = [1,2,3,4,5]
>>> L[len(L)-2:]
[4, 5]
>>> L[len(L)-0:]
[]
于 2012-07-05T04:51:13.260 回答
2

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

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[:]
于 2012-07-05T04:51:43.190 回答
0

由于双重反转,这可能非常低效,但希望反转序列以使索引更容易的想法有一些东西:

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]
[]
于 2012-07-05T04:52:10.640 回答
0

你可以在那里滑一个条件

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

我认为这个版本不太清楚。您应该在旁边使用评论

L[-i or len(L):]
于 2012-07-05T07:10:38.983 回答