字符串索引超出范围,我无法修复错误

时间:2017-03-14 19:54:46

标签: python-3.x

以下是我的代码。在“观察到的数字”循环的某处,有一个索引错误,我似乎无法找到或修复。我认为这与PINS列表有关,但我不确定,因为我的编辑都没有产生任何影响。观察失败的测试用例= '11'。单个案件全部通过。不幸的是,由于我正在使用代码转换,因此没有给出错误的行,只有以下内容:

回溯:

in

在get_pins中

IndexError:字符串索引超出范围

def get_pins(observed):

    # Let's see what we're working with
    print("observed")
    print(observed)
    print(" ")

    # Dictionary of possible numbers for a half-assed observation of a key press.
    possible = {'0':'08','1':'124','2':'1235','3':'236', 
                '4':'1457','5':'24568','6':'3569',
                '7':'478','8':'05789','9':'689'}

    # Single digit pwd case
    PINS=[]

    if len(observed) == 1:
        for digit in possible[observed]:
            PINS.append(digit)
        return PINS

    # Find number of possible PINs
    num_possibles = 1
    # Step through observed digits
    for digit in observed:
        num_possibles*=len(possible[digit])

    # Populate PINS to allow string manipulation
    PINS = " "*num_possibles
    print(PINS[num_possibles])
    num_change = num_possibles
    change = []
    count = 0

    # Step through observed, determine change of digit, 
    for digit in observed:

        # Last digit in observed means it iterates every time
        if digit != observed[len(observed)-1]:

            # Develop array for checking position
            num_change = num_change/len(possible[digit])

            for i in range(1,len(possible[digit])):
                change.append(i*num_change)

            print(change)

            # Populate PINS with possible digit, full pin is created after final iteration of digit/observed loop
            for pin in range(0,num_possibles-1):
                PINS[pin] = PINS[pin] + possible[digit][count]
                if (pin+1) in change:
                count+=1       
            change=[]
            count =0
        else:
            for pin in range(0,num_possibles-1):
                PINS[pin] = PINS[pin] + possible[digit][count]
                count+=1
                if count == len(possible[digit]):
                    count = 0

  return PINS

1 个答案:

答案 0 :(得分:0)

问题在于:

PINS = " "*num_possibles
print(PINS[num_possibles])

第一行创建一个长度为num_possibles的空格字符串。这意味着有效索引为0, 1, ..., num_possibles - 1。但是,在下一行中,您尝试将字符串索引为不存在的索引num_possibles

我只想放弃print。有什么意义呢?你知道PINS是一个包含所有空格的字符串,所以为什么要这么麻烦?

字符串是不可变的,因为PINS是一个字符串,即行

PINS[pin] = PINS[pin] + possible[digit][count]

会触发错误:

TypeError: 'str' object does not support item assignment

您应该做的是将PINS初始化为

PINS = [' ']*num_possibles

或者,甚至可能更好

PINS = ['']*num_possibles

在哪种情况下

PINS[pin] = PINS[pin] + possible[digit][count]

是合法的(虽然可以通过使用+=来缩短) - 虽然我不确定这是否是你真正想要做的事情,因为你将{存储的值的字符串连接在一起{ {1}}并且不添加由这些字符串表示的数字。

在功能结束时,将possible替换为return PINS''。join(PINS)`

这将修复你的一些错误,但由于我既不知道预期输入也不知道输出我不能再说了。