如何在Python中使用变量作为切片字符串的索引?

4 投票
3 回答
17162 浏览
提问于 2025-04-17 03:31

我一直在尝试用循环从一个字符串中切出两个字符,但结果只切出了一个。

我试过:

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 个回答

1

从中间位置进行推理在我们从左到右遍历时是有效的:

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

记住切片索引的一个好方法是把数字看作是元素之间位置的标签。

slice example

比如说,如果你想切片 ba,你可以用 fruit[0:2]。这样想的话,就不会觉得很反直觉了,而且你也能轻松避免代码中常见的“多一或少一”的错误。

9

切片的值并不是切片的开始和结束的字符,而是开始和结束的位置。如果你想切出两个元素,那么你的结束位置必须比开始位置大2

input[i:i+2]

撰写回答