【问题标题】:Confused on lists: TypeError: list indices must be integers, not str对列表感到困惑:TypeError:列表索引必须是整数,而不是 str
【发布时间】:2016-03-23 19:22:08
【问题描述】:

我有一个包含许多列表的程序,并且可以轻松地为它们分配变量,除了一个列表。快速了解程序,我打开 lsblk 检查磁盘,保存到文件。然后我删除带有 .sh 文件的磁盘,然后扫描以查看新列表是什么。我比较两个列表的差异,然后读取差异并扫描整数,然后将第一个 int 拉出,最终将其保存回名为 diskchange 的列表中。见下文:

diskchange = [None]*5

for i in range(1,3):
    # Initial disk scan
    lsblk = subprocess.Popen(['lsblk'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    scan1 = [line.strip() for line in lsblk.stdout if 'nvme' in line]

    # Disable the slot to get ready to record which drive number disappeared
    with open('removeslot%d.sh' %i, 'rb') as file:
        script = file.read()
    subprocess.call(script, shell=True)

    lsblk = subprocess.Popen(['lsblk'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    scan2 = [line.strip() for line in lsblk.stdout if 'nvme' in line]

    for i in scan1:
        if i not in scan2:
                result = result + i

    disk = filter(str.isdigit, result)
    strdiskchange = str(disk)
        disk = int(strdiskchange[0])
    print disk
    print type(disk)
    print type(diskchange)
    diskchange[i] = disk
        print("The new disk added to slot %i is /dev/nvme%sn1" %(i, diskchange[i]))

你可以看到我试图用一些打印语句来诊断问题,这里是输出:

0
<type 'int'>
<type 'list'>
Traceback (most recent call last):
File "GUIArduino.py", line 61, in <module>
diskchange[i] = disk
TypeError: list indices must be integers, not str

0 是从结果中提取的最终值,我将磁盘类型打印到屏幕以显示它是 int 类型,我也将 diskchange 打印为类型列表,但我无法将 int 存储到列表中原因。

我尝试将disk = []的初始值更改为None, 0, 1, '',没有任何变化。我也试过 str(disk) int(disk) 之类的。

即使只是键入 diskchange[i] = 0 也会给出相同的信息。哪个让我最困惑

任何帮助将不胜感激。

【问题讨论】:

  • 您将变量i 重用于两个不同的循环。通常这是可以的,但因为循环在彼此内部,i 被覆盖。
  • 哇,这么小的错误。谢谢你让我头疼

标签: string list int


【解决方案1】:

你正在用另一个 i 遮蔽你的 for 循环 i

for i in range(1,3):
    # type(i) is int
    …
    for i in scan1:
        …
    # type(i) is str
    …
    diskchange[i] = disk # i is str() here, so it yells at you!

将你的内部循环的索引从i 更改为j,你应该没问题。

在 python 中,变量的可见性是在一个完整的函数上,而不是一个块上。 所以当你在一个块中定义一个变量时,它在块之后仍然可见:

 i = 'foobar'
 print(i, type(i))
 for i in range(100):
     pass
 print(i, type(i))

将给予:

foobar str
100 int

所以重用变量名时要小心。

要解决您的问题,只需将索引名称更改为j

for j in scan1:
    if j not in scan2:
            result = result + j

奖金:

在下面的 sn-p 中,您正在读取脚本的全部内容,通过将其全部内容发送到 shell 来执行它:

with open('removeslot%d.sh' %i, 'rb') as f:
    script = f.read()
subprocess.call(script, shell=True)

这实际上是过度设计的,你可以这样做:

subprocess.call('removeslot%d.sh' % i, shell=True)

执行脚本(或'bash removeslot%d.sh' % i,以防您的.sh 不可执行)。另请注意,您再次隐藏了一个符号:file 是用于处理全局可用文件的类。请改用f

HTH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多