我一直在尝试使用循环从字符串中切出两个字符,但不是抓取两个字符,而是只抓取一个字符。
我试过了:
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
答案 0 :(得分:8)
切片值不是切片的开始和结束字符,它们是开始和结束点。如果你想切两个元素,那么你的止损必须 2 大于你的开始。
input[i:i+2]
答案 1 :(得分:5)
记住切片索引的一个好方法是将数字视为标记元素之间的位置。
因此,例如要切片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]