TypeError: string indices must be integers, not str on Python Dictionary

TypeError: string indices must be integers, not str on Python Dictionary

我被困住了,我确信这是很简单的事情,但我现在只是在兜圈子。下面的代码是一个脚本片段,它迭代了我输入到列表和字典中的一些值,并生成了我可以输入另一个程序的文本文件。我遇到的问题是在尝试循环 Direction 列表并将相关字典中的相应值打印到文件时出现以下错误:

TypeError: 字符串索引必须是整数,而不是 str

Direction = ('E', 'NE')

E = {
    'InitialHeading': 0,
    'InitialX': 22.480,
    'InitialY': 0.000,
    'ActiveCurrent': '10y_Current_W'}

NE = {
    'InitialHeading': 45,
    'InitialX': 15.896,
    'InitialY': 15.896,
    'ActiveCurrent': '10y_Current_SW'}

casenumber = 0

for Offset in Direction:

            # CREATE INDIVIDUAL TEXT FILES
            casenumber = casenumber + 1
            filename = 'Case%.3d.txt' % casenumber
            f = open(filename, 'w')
            print >>f, 'InitialHeading: ', Offset['InitialHeading']
            print >>f, 'InitialX: ', Offset['InitialX']
            print >>f, 'InitialY: ', Offset['InitialY']
            print >>f, 'ActiveCurrent: ', Offset['ActiveCurrent']
            f.close()

如果我将 Offset 替换为字典名称,则该行内容如下:

print >>f, 'InitialHeading: ', E['InitialHeading']

那么输出正是我想要的,我知道 Offset 等于 E 当我 运行文件,因为我添加了一行以将 Offset 的值打印到控制台 window.

当字典名称与从 Direction 获得的变量 Offset 的值相同时,为什么它不能识别字典名称列表?这段代码来自嵌套的 for 循环,所以我需要能够参考列表和字典来获取值,而不是更手动的替代方法。

您在 Offset 变量上使用订阅语法,它是一个 字符串 ,取自 Direction

不能直接使用Offset中的字符串作为同名变量的占位符。相反,*存储字典:

E = {
    'InitialHeading': 0,
    'InitialX': 22.480,
    'InitialY': 0.000,
    'ActiveCurrent': '10y_Current_W'}

NE = {
    'InitialHeading': 45,
    'InitialX': 15.896,
    'InitialY': 15.896,
    'ActiveCurrent': '10y_Current_SW'}

Direction = (E, NE)

或者更好的是,使用另一个字典来包装方向:

Direction = {
    'E': {
        'InitialHeading': 0,
        'InitialX': 22.480,
        'InitialY': 0.000,
        'ActiveCurrent': '10y_Current_W'},

    'NE': {
        'InitialHeading': 45,
        'InitialX': 15.896,
        'InitialY': 15.896,
        'ActiveCurrent': '10y_Current_SW'}
}

现在您可以遍历 that 字典并获得方向的字符串名称和与之关联的设置:

for direction, settings in Directions.items():
    # CREATE INDIVIDUAL TEXT FILES
    casenumber = casenumber + 1
    filename = 'Case%.3d.txt' % casenumber
    with open(filename, 'w') as f:
        print >>f, 'InitialHeading: ', settings['InitialHeading']
        print >>f, 'InitialX: ', settings['InitialX']
        print >>f, 'InitialY: ', settings['InitialY']
        print >>f, 'ActiveCurrent: ', settings['ActiveCurrent']