'int'对象不可下标吗? (解决了)

时间:2019-08-17 17:42:52

标签: python python-3.x algorithm recursion dice

感谢@chepner解决了这个问题!

我正在www.edabit.com上进行算法挑战,那里有骰子掷骰列表,并且:

  • 如果数字为6,则列表中的下一个数字将放大2倍。

  • 如果数字为1,则列表中的下一个数字为0

这是我的代码:

def rolls(lst):
out = 0
iterate = 0
if lst[iterate] == 1:
    out+=lst[iterate]
    lst[iterate+1] = 0
    iterate+=1
    rolls(lst[iterate])
elif lst[iterate] == 6:
    out+=lst[iterate]
    lst[iterate+1] = lst[iterate+1]*2
    iterate+=1
    rolls(lst[iterate])
else:
    out+=lst[iterate]
    iterate+=1

控制台显示“ TypeError:'int'对象不可下标”

有什么想法吗?同样,您发现的其他任何错误也会很有用。

我尝试了其他IDE,但是它提供了相同的输出。

对于“ 1、6、2、3、2、4、5、6、2”这样的系列,我希望27

3 个答案:

答案 0 :(得分:0)

如评论中所述,对于此类问题,我不会使用递归。循环就足够了:

l = [1, 6, 2, 3, 2, 4, 5, 6, 2]

from itertools import accumulate

print(sum(accumulate([0] + l, lambda a, b: b*{1:0, 6:2}.get(a, 1))))

打印:

27

答案 1 :(得分:0)

如果必须使用递归解决此问题,则需要传递两个参数,第一个参数lst和第二个参数迭代。请注意,lst [iterate]是一个元素,您在递归调用该函数时会将其传递给该函数。

因此将函数修改为带有两个参数lst并进行迭代。最初将参数传递为lst的完整列表,将0传递为迭代。 rolls(lst,0)应该是您的初始函数调用。

我想您希望变量在访问它们时包含lst中所有条目的总和,因此也需要将其作为参数传递,从而使您的初始调用成为rolls(lst,0,0)。我已经对函数进行了编辑,以相应地返回计算出的总和。

def rolls(lst, iterate, out):
    if iterate == len(lst):
        return out
    if lst[iterate] == 1:
        out += lst[iterate]
        if iterate + 1 < len(lst): #In order to avoid index out of bounds exception
            lst[iterate + 1] = 0
        rolls(lst, iterate + 1, out)
    elif lst[iterate] == 6:
        out += lst[iterate]
        if iterate + 1 < len(lst): #In order to avoid index out of bounds exception
            lst[iterate + 1] = lst[iterate + 1] * 2
        rolls(lst, iterate + 1, out)
    else:
        out += lst[iterate]
        rolls(lst, iterate+1, out)

答案 2 :(得分:0)

您可以查看上一个项目,而不是查看下一个项目:

from itertools import islice

def rolls(lst):
    if not lst:
        return 0
    total = prev = lst[0]
    for x in islice(lst, 1, None):
        if prev == 1:
            x = 0
        elif prev == 6:
            x *= 2
        prev = x
        total += x
    return total

例如:

>>> rolls([1, 6, 2, 3, 2, 4, 5, 6, 2])
27
>>> rolls([])
0
>>> rolls([1])
1
>>> rolls([2])
2
>>> rolls([3])
3
>>> rolls([4])
4
>>> rolls([6,1])
8
>>> rolls([6,2])
10
>>> rolls([6,1,5])
13