Отрицательная нулевая нарезка 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.
- Инвертировать срез в python
- индексирование / нарезка в массиве numpy для его изменения
- Вставить элемент в список Python после каждого n-го элемента
- Python pandas разбивает данные на несколько диапазонов индексов
- Расширенный срез, который начинается с начала последовательности с отрицательным шагом
- Извлечение элементов списка на нечетных позициях
- Перечень списков списка Python
- Python - случайным образом разбивает список на n почти равных частей
- Что такое :: (двойная двоеточие) в Python при подпиксельных последовательностях?
- Список гарантированно является пустым списком, если список предшествует списку ?
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
- В чем разница между = b и a = b
- Нарезка списка на Python без создания копии
- Как извлечь произвольную строку значений из массива numpy?
- Как перебирать первые n элементов списка?
- Почему индексирование массивов numpy с помощью скобок и запятых отличается поведением?
- Эффективное извлечение памяти перекрывающихся патчей из матрицы
- Настройте нарезку Python, пожалуйста, сообщите