68111


"WUB"という文字列をスペースに変えて、解読を行うというプログラムなのですが、

[code]

    song = "AWUBWUBWUBBWUBWUBWUBC"
    numbers = [int(i) for i in range(len(song))]
    spaces = []
    words = []
    for i in range(len(song)-3):
      one, two, three = song[i], song[i+1], song[i+2]
      if one == "W" and two == "U" and three == "B":
        numbers.pop(i)
        numbers.pop(i+1)
        numbers.pop(i+2)
        spaces.append(i)
        i += 3
      else:
        i+=1
      for i in range(len(numbers)):
        words.append(song(numbers[i]))
      for k in range(len(spaces)):
        words.insert(spaces[k], " ")
    ans = ''.join(words)
    print(ans)
    
[/code]

としたところ、

[code]

    TypeError                                 Traceback (most recent call last)
    <ipython-input-21-cc5ee7fdeeb7> in <module>()
         14     i+=1
         15   for i in range(len(numbers)):
    ---> 16     words.append(song(numbers[i]))
         17   for k in range(len(spaces)):
         18     words.insert(spaces[k], " ")
    
    TypeError: 'str' object is not callable
    
[/code]

となってしまいます。  
intにしているつもりなのですが、どこでstrにすり替わってしまっているのか教えていただけると幸いです。


CC BY-SA 4.0
2020-06-29T10:25:41.810
68110
2020-06-29T14:57:49.950
36869
question
python python3
str is not callable の原因が分からない


直接的には`words.append(song(numbers[i]))`という行が、`song(numbers[i])`という関数があって呼ばれているように見えるが、そんなものは無いのでエラーになっているということです。

`song`は文字列なので、それと`numbers[i]`との関係が、本当は何をしようと考えていたか？ で修正内容が変わってくるでしょう。

* * *

コメント対応：

単純には`( )`を`[ ]`に変えることで、`song`から1文字づつ`words`に追加する処理に出来ます。

[code]

    words.append(song[numbers[i]])
    
[/code]

しかしそれをすると、今度は4回目に実行された`numbers.pop(i+1)`の行で`IndexError: pop index out of
range`になります。  
この時`i`は11で、`numbers`は [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 19, 20]
でした。`i+1`が12なのでリストの要素数の範囲外ですね。

だからまだまだプログラムは未完成状態でしょう。


CC BY-SA 4.0
2020-06-29T10:44:20.313
68111
2020-06-29T14:57:49.950
2020-06-29T14:57:49.950
26370
26370
68110
answer