Как вы используете переменную в качестве индекса при разрезании строк в Python? - PullRequest
4 голосов
/ 02 октября 2011

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

Я пробовал:

input[i:i+1]

и

input[i:(i+1)]

но ни один из них не работает.

Как использовать переменную для нарезки?

Полная процедура:

def StringTo2ByteList(input):
    # converts data string to a byte list, written for ascii input only
    rlist = []
    for i in range(0, len(input), 2):
        rlist.append(input[i:(i+1)])
    return rlist

Ответы [ 3 ]

8 голосов
/ 02 октября 2011

Значения среза - это не начало и конец символов среза, это начало и конец точек Если вы хотите нарезать два элемента, то ваш стоп должен быть на 2 больше, чем ваш старт.

input[i:i+2]
5 голосов
/ 02 октября 2011

Хороший способ запомнить индексирование срезов - это думать о том, что числа обозначают позиции между элементами.

slice example

Так, например, для нарезки ba вы бы использовали fruit[0:2].Думая об этом таким образом, вещи больше не кажутся нелогичными, и вы можете легко избежать ошибочных ошибок в вашем коде.

1 голос
/ 02 октября 2011

Рассуждение на основе промежуточных позиций работает, когда мы выполняем итерацию слева направо:

li = [10, 20, 55, 65, 75, 120, 1000]
print 'forward slicing li[2:5]    ->',li[2:5]
# prints forward slicing li[2:5]    -> [55, 65, 75] 

потому что поз 2 между 20/55 и поз 5 между 75/120

.

Но это не работает, когда мы выполняем итерацию справа налево:

li = [10, 20, 55, 65, 75, 120, 1000]
print li
print 'reverse slicing li[5:2:-1] ->',li[5:2:-1]
# prints reverse slicing li[5:2:-1] -> [120, 75, 65]

Мы должны думать о li [5: 2: -1] как:
от элемента li [5]
(который равен 120) до элемента без учета li [2] (который равен 55)
то есть
из элемента li [5] (что составляет 120) только в том случае, если li [3] включает (что составляет 65).

.

Это делает опасную обратную нарезку с самого конца:

li = [10, 20, 55, 65, 75, 120, 1000]
print li[ -1 : 2  : -1 ]
# prints [1000, 120, 75, 65] not [120, 75, 65, 55]
# the same as:
print li[  None : 2 : -1 ]
# prints [1000, 120, 75, 65]
print li[       : 2 : -1 ]
# prints [1000, 120, 75, 65]

и

li = [10, 20, 55, 65, 75, 120, 1000]
print li[ 4 : 0 : -1]
# prints [75, 65, 55, 20] , not [65, 55, 20, 10]

.

В случае затруднения с таким мышлением, способ предотвратить ошибки - написать

print list(reversed(li[2:5]))
# prints [75, 65, 55]
print list(reversed(li[2:-1]))
# prints [120, 75, 65, 55]
print list(reversed(li[0:4]))
# prints [65, 55, 20, 10]

.

Обратите внимание, что единственный способ получить обратный срез до первого ВКЛЮЧЕННОГО элемента - это

print li[ 4 :      : -1]

что означает

print li[ 4 : None : -1]
...