Python - 将int转换为字符串只能工作一次?

时间:2016-10-31 02:36:33

标签: python string list int fizzbuzz

我正在学习如何在python中操作列表,所以我决定做一个练习,看看我是否可以实现" fizzbuzz"只使用python的列表操作的游戏如下所示:

#Fizzbuzz Implementation

def fizzbuzz(L):
    # L is a list of integers in order 
    for i in L[2::3]:
        L[i-1] = str(L[i-1])
        L[i-1] = L[i-1].replace(L[i-1],'')
        #No exception thrown here

    for i in L[4::5]:
        L[i-1] = str(L[i-1]) #Exception on this line
        L[i-1] = L[i-1].replace(L[i-1],'')

    for i in L[2::3]:
        L[i-1] += 'fizz'

    for i in L[4::5]:
        L[i-1] += 'buzz'

    return L[:]

L = list(range(1,101))
L[:] = fizzbuzz(L)

我试图将感兴趣的列表中的整数转换为空字符串,然后将字符串附加到它们,但是我得到了一个 TypeError:不支持的操作数类型 - :' str'和' int'

我注意到第一个循环没有问题,但是异常总是抛出第二个循环。即使我切换循环的顺序,也会发生这种情况。

有人可以解释抛出的异常是什么以及为什么它只发生在第二个循环上?

2 个答案:

答案 0 :(得分:1)

执行第一个循环后,列表中的某些元素是字符串,您不能再将它们用作索引来访问列表。你也做了一些奇怪的事情,比如将一个元素转换为一个字符串然后用空字符串替换整个事件而不是仅仅分配一个空字符串,并调用一个改变列表的函数,返回列表,并重新分配所有这些元素回归自身。相反,用enumerate跟踪索引,记住从1开始并将索引乘以切片的步长值。

def fizzbuzz(L):
    for i,val in enumerate(L[2::3], start=1):
        L[i*3-1] = ''
    for i,val in enumerate(L[4::5], start=1):
        L[i*5-1] = ''
    for i,v in enumerate(L[2::3], start=1):
        L[i*3-1] += 'fizz'
    for i,v in enumerate(L[4::5], start=1):
        L[i*5-1] += 'buzz'

L = list(range(1,101))
fizzbuzz(L)

答案 1 :(得分:-1)

  

不支持的操作数类型 - :'str'和'int'

Python解释器说你试图减去一个字符串和一个整数。喜欢:“123” - 1 在第一个循环中,您已将整数转换为字符串,因此如果要在第二个循环中进行减法,则需要将字符串转换回整数。喜欢:int(“123”) - 1

L[i-1] = str(L[int(i)-1])