Отрицательная нулевая нарезка 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
  • Срезание списка с динамическим индексом в
  • Обратная строка: string работает, но строка и другие не
  • Нарезка списка с использованием переменной в Python
  • перевернуть строку в Python
  • Расширенный срез, который начинается с начала последовательности с отрицательным шагом
  • Вставить элемент в список Python после каждого n-го элемента
  •  
    Interesting Posts for Van-Lav

    Является ли использование __del __ () для очистки в python ненадежным?

    Обучение wordvec в Tensorflow, импорт в Gensim

    Функция mail.send () в web2py для возвращенного адреса электронной почты или адреса электронной почты, который не существует

    Как добавить элементы из двух списков в один список?

    Чтение в части файла, остановка и запуск с определенных слов

    Странное поведение Try-Except-Else-finally с операторами Return

    Python: свойство класса доступа из строки

    Как адаптировать или изменить размер прямоугольника внутри объекта, не включая (или с несколькими числами) фоновых пикселей?

    Извлечь средний кадр видео в Python с помощью ffmpeg?

    Использование API LinkedIn с Python

    Установка Python / PyGame на Mac

    рекомендуемая структура для разработки настольных компьютеров python

    Pandas: несколько столбцов в один столбец

    Невозможно интерпретировать MATLAB interp2d в Python scipy.interp

    Python: Whoosh, кажется, возвращает неверные результаты

    Python - лучший язык программирования в мире.