2015-03-12 2 views
2

Я хочу, чтобы пройти список в определенном расположении ломтиков:Арифметика в Python нарезка, конец поведение

l = range(10) 
for i in (0,1,2): 
    print l[i:i + 3] 

# [0, 1, 2] 
# [1, 2, 3] 
# [2, 3, 4] 

Однако, когда я пытаюсь сделать это с окончанием списка, случай, когда i = 0 терпит неудачу

l = range(10) 
for i in (0,1,2): 
    print l[-(i + 3):-i] 

# [] // expected: [7, 8, 9] 
# [6, 7, 8] 
# [5, 6, 7] 

Я понимаю, почему это не работает.

l[-1:] 
l[-1:None] 

оба работают, но

l[-1:0] 

получает пустой набор из-за 0 ссылающийся на первый элемент, а не «элемент после последнего элемента».

Однако мне интересно, есть ли решение для реализации простой «итерации от x до конца», где end не нужно обрабатывать специально, если я действительно дойду до конца.

Примеры, приведенные выше, являются просто примерами, я пытаюсь присвоить значения в NumPy, так что l[...].reverse() и т. Д. Не будет работать.

+1

Ваш вопрос будет более понятно, если добавить ожидаемой выходной – Kasramvd

+0

Спасибо за подсказку, я добавил вывод –

ответ

3

Вы можете использовать len(l) - i вместо -i:

l = range(10) 
for i in (0,1,2): 
    print l[-(i + 3):len(l) - i] 

выход:

[7, 8, 9] 
[6, 7, 8] 
[5, 6, 7] 
+0

Это не должно, питон достаточно умны, чтобы вычислить его один раз и повторно использовать. – matino

+0

@ Kasra «Список» сохраняет свою длину, поэтому вычислений не так много. Однако использование локальной переменной позволит избежать вызова функции. –

1

Вы можете также использовать оператор шага и обратный список:

for i in (0,1,2): 
    new_l = l[-1-i:-4-i:-1] 
    new_l.reverse() 
    print new_l 
+0

Как я уже сказал, я не могу использовать 'reverse()'. –

+0

Ну, вы тоже можете отменить использование среза: 'l [-1 :: - 1]' – matino

3

Один подход это сделать немного арифметики, чтобы избежать использования отрицательных индексов.

n = len(l) 
for i in (0, 1, 2): 
    j = n - 3 - i; 
    print l[j: j + 3] 
Смежные вопросы