我经常发现自己必须使用序列中的最后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,代码就会简单得多。
答案 0 :(得分:11)
您可以将其从L[-2:]
切换为L[len(L)-2:]
>>> L = [1,2,3,4,5]
>>> L[len(L)-2:]
[4, 5]
>>> L[len(L)-0:]
[]
答案 1 :(得分:10)
只需使用or
的合并行为。
>>> print 4 or None
4
>>> print -3 or None
-3
>>> print -0 or None
None
答案 2 :(得分: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[:]
答案 3 :(得分: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]
[]
答案 4 :(得分:0)
你可以在那里放一个条件
L[-i if i else len(L):]
我认为这个版本不太清楚。你应该在旁边使用评论
L[-i or len(L):]