2016-05-25 8 views
0

私はPythonを使って単純なチャットボットを作成しましたが、使用しようとすると、エラー:TypeError: list indices must be integers, not strが返されます。Pythonのchatbot - TypeError:リストのインデックスはstrでなく整数でなければなりません

私は後でエラーになるでしょうが、最初にボットが何をすべきかを説明します。ボットには、ユーザとボットのすべてのレスポンスが格納されたデータベースが辞書で表示されます。

  1. まず、「Hi!」を出力します。
  2. ユーザーに入力を求められます。
  3. すべての出力には、いくつかの応答が関連付けられています。出力は辞書のキーに格納され、レスポンスはキーの値であるリストに格納されます。
  4. ボットの出力は、ユーザーの入力に関連付けられた応答のリストからランダムに選択されます。
  5. 入力が辞書にない場合は、それが追加されます。また、入力はボットによってエコーされます。
  6. これを永遠に繰り返します。

(説明が悪かった場合は、読み続ける場合は申し訳ありませんが、多分あなたは理解することがあります。)

だから、ここでボットが何をすべきかの一例です。

BOT> Hi! 
YOU> Hello! 
BOT> Hello! 
YOU> How do you do? 
BOT> How do you do? 
YOU> I'm fine, thanks. 
BOT> I'm fine, thanks. 
YOU> Hello! 
BOT> How do you do? 
YOU> I'm fine thanks. 
BOT> Hello! 

ここで私は私がいる問題に、(私は必要とされていない部分を除く)

import pickle 
import random 

class Bot: 
    def __init__(self, current, database, saveFile): 
     self.current = "Hi!" 
     self.database = [] 

    def say(self, text): 
     print("BOT> " + text) 
     self.current = text 

    def evaluate(self, text): 
     if text in self.database: 
      self.say(random.choice(self.database[text])) 

     else: 
      self.database[text] = [] 
      self.say(text) 

bot = Bot("", {}) 
bot.say("Hi!") 

while 1: 
    bot.evaluate(input("YOU> ")) 

そして今を使用しているコードです。

ボットと話そうとすると、エラーTypeError: list indices must be integers, not strが表示されます。それはコードself.database[text] = []の行を指していました。 はここに例を示します

BOT> Hi! 
YOU> Hello! 
(error) 

私は何が起こっているのか分からないので、私は、私はそれを試してみて、修正するために何をすべきかを知りません。私はコードが正しく動作すると思ったが、それは...誰も私に少し助けを与えることができませんでしたか?

+0

データベースの種類リストため、エラーのある中括弧で

self.database = [] 

dictが作成されたリストを作成しています。おそらくそこに辞書が必要です。 – fusion

+0

のように、 'self.database [text]'は 'self。database'はLISTです。これは 'text'のような文字列があなたのインデックスになることを許しません。あなたは何をしようとしているのかははっきりしていませんが、['dicts'](https://docs.python.org/2/library/stdtypes.html#mapping-types-dict)を調べることをお勧めします。 –

+0

@fusion OK、ありがとう!私はそれを逃したとは信じられない:P – m654

答えて

1

self.databaseです。リスト項目は、リスト内での位置を指定することによってアクセスされます。たとえば、最初の項目の場合はself.database[0]、5番目の項目の場合はself.database[4]です。

textをリストの位置として使用すると意味がありません。

整数の位置ではなくテキストキーに基づいてアイテムを保存する場合は、リストの代わりに辞書を使用します。

0

は、データベースが辞書で言及し、まだあなたが

self.database = {} 
関連する問題