在Python中切割字符串时,如何使用变量作为索引?

时间:2011-10-02 08:28:23

标签: python string slice

我一直在尝试使用循环从字符串中切出两个字符,但不是抓取两个字符,而是只抓取一个字符。

我试过了:

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 个答案:

答案 0 :(得分:8)

切片值不是切片的开始和结束字符,它们是开始和结束。如果你想切两个元素,那么你的止损必须 2 大于你的开始。

input[i:i+2]

答案 1 :(得分:5)

记住切片索引的一个好方法是将数字视为标记元素之间的位置。

slice example

因此,例如要切片ba,您将使用fruit[0:2]。当以这种方式思考时,事情看起来不再直观,并且您可以轻松避免在代码中出现一个错误。

答案 2 :(得分: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] 

因为pos 2在20/55之间,pos 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]

请注意,就第一个元素INCLUDED而言,获得反向切片的唯一方法是

print li[ 4 :      : -1]

代表

print li[ 4 : None : -1]