Отрицательная нулевая нарезка Python

Мне часто приходится работать с последними 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.

5 Solutions collect form web for “Отрицательная нулевая нарезка Python”

Вы можете переключить его с L[-2:] на L[len(L)-2:]

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

Просто используйте or коалесцирующее поведение.

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

Когда вы обнаруживаете, что используете конструкцию несколько раз, превратите ее в функцию.

 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[:] 

Это, вероятно, будет ужасно неэффективным благодаря двойному обращению, но, надеюсь, есть идея перевернуть последовательность, чтобы упростить индексирование:

 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] [] 

Вы можете пропустить условное условие там

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

Я думаю, что эта версия менее ясна. Вы должны использовать комментарий рядом с ним

 L[-i or len(L):] 
  • Python: Получить список из списка
  • Перечень списков списка Python
  • Python pandas разбивает данные на несколько диапазонов индексов
  • python создает объект slice из строки
  • Компактный способ присвоения значений списком разрезов в Python
  • Эффективность нарезки списка Python
  • Вставить элемент в список Python после каждого n-го элемента
  • Как объяснить обратную последовательность последовательности с помощью нотации среза a
  • Python - лучший язык программирования в мире.