基本的python误解了dict(TypeError:字符串索引必须是整数)



我开始学习python,然后尝试使用pyqt制作图灵机应用程序。我从 QTextEdit获得一些"代码",然后将其放入dict中,然后得到类似的东西:

{'1': {'a': ['s', 'D', '2'], 's': ['s', 'G', '2']}, '2': {'a': ['a', 'D', '1']}}

我具有此功能,其中 table是一个dict:

def execute_TM(self, table, ruban, etat1):
    self.Ruban.position = 1
    self.table = table
    etatAct = etat1
    while etatAct != 'stop':
        symb = self.Ruban.lire_cellules()
        # print symb
        print self.table
        nvSymb = self.table[etatAct][symb][0]
        self.Ruban.ecrire(nvSymb)
        if table[etatAct][symb][1] == 'D':
            self.Ruban.deplacement_droite()
        if table[etatAct][symb][1] == 'G':
            self.Ruban.deplacement_gauche()
        else:
            print
            "erreur code deplacement"
        etatAct = table[etatAct][symb][2]

我得到了这个错误:

nvSymb = self.table[etatAct][symb][0]
TypeError: string indices must be integers

我一直在阅读很多有关此错误的文章,并尝试了不同的事情...但是我仍然不明白。

编辑:多亏了您的帮助,我要理解,因此,如果我有:

table={'1': {'a': ['s', 'D', '2'], 's': ['s', 'G', '2']}, '2': {'a': ['a', 'D', '1']}}

,然后我想从主键'1'和键's'获取列表的第二个元素: 'G'我可以打电话给table['1']['s'][1],所以它类似:

table["here it's a string"]["here it's also a string"]["here it's an integer"]

它有效:

>>> table={'1': {'a': ['s', 'D', '2'], 's': ['s', 'G', '2']}, '2': {'a':['a', 'D', '1']}}
>>> etatAct='1'
>>> symb='s'
>>> table[etatAct][symb][1]
'G'

我仍然不明白为什么它在功能中不起作用..

edit2:

使用type(),我发现self.table不是dict,而是PyQt4.QtCore.QStringList任何人都知道如何轻松转换它?

您将了解此错误是什么,

In [10]: a = 'Hellooo'
In [11]: print a[0]
H
In [12]: print a['0']
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-175cb7ceb755> in <module>()
----> 1 print a['0']
TypeError: string indices must be integers, not str

在您的代码中,试图用字符串而不是字典索引字符串。

从您的错误中清楚地表明(etatact,symb)的一个索引不是整数,而是字符串。

nvSymb=self.table[etatAct][symb][0]
TypeError: string indices must be integers

您可以通过将其转换为整数来尝试。

 nvSymb=self.table[int(etatAct)][int(symb)][0]

您应该接受此:

nvSymb=self.table[etatAct][symb][0]

与众

tmp = self.table[etatAct]
nvSymb = tmp[symb][0]

,看看self.table还是self.table[etaAct]是由非授权者索引的字符串。首先要知道您可以解决此输入的知识。

最新更新