Python:尴尬的索引超出范围

时间:2015-11-21 23:33:56

标签: python string runtime-error

我在Python中有一个非常尴尬的索引超出范围错误。对我来说真的没有意义。 这是我的代码:

def binarytotext(listing):
    size = len(listing)
    phrase = ""
    for arguments in range(size):
        temp = listing[arguments]
        sizebin = 7
        aski = 0
        for arguments2 in range(sizebin):
            if (arguments2 == 1):
                inter = int(temp[arguments2]) * 64
                aski = aski + inter
            elif (arguments2 == 2):
                inter = int(temp[arguments2]) * 32
                aski = aski + inter
            elif (arguments2 == 3):
                inter = int(temp[arguments2]) * 16
                aski = aski + inter
            elif (arguments2 == 4):
                inter = int(temp[arguments2]) * 8
                aski = aski + inter
            elif (arguments2 == 5):
                inter = int(temp[arguments2]) * 4
                aski = aski + inter
            elif (arguments2 == 6):
                inter = int(temp[arguments2]) * 2
                aski = aski + inter
            elif (arguments2 == 7):
                inter = int(temp[arguments2]) * 1
                aski = aski + inter
        letter = chr(aski)
        phrase = phrase + letter
    return phrase

代码运行正常,它确实有效,但是当它执行完毕时它会抛出这个错误:

inter = int(temp[arguments2]) * 64
IndexError: string index out of range

这对我来说没有意义,因为我的功能一直工作到最后。这真的很尴尬。我不明白。

1 个答案:

答案 0 :(得分:0)

看起来你在listing的末尾有一个额外的空字符串。您的错误由第一个索引temp[0]触发。

请注意,您的代码相当不同于pythonic。使用索引和一些数学计算每个位的乘数更好,而不是需要为每种情况明确地写出来。而不是迭代范围和索引来获取值,直接迭代迭代(如果您还需要索引,请使用enumerate):

for temp in listing:
    for index, value in enumerate(temp):
        inter = int(value) * 64 >> index
        aski += inter

您也可以使用int(temp, 2)将二进制字符串直接转换为整数,而不是自己转换。 "".join(chr(int(binary_string, 2)) for binary_string in listing)让你的整个功能完成一行!