【问题标题】:EXPLAIN - 'float' object does not support item assignment解释 - 'float' 对象不支持项目分配
【发布时间】:2020-10-09 17:22:47
【问题描述】:
fname=open('C:\Program Files (x86)\Python38-32\mbox-short.txt','r')
count=0
val=0.000
for num in fname:
    if num.startswith('X-DSPAM-Confidence:'):
        count=count+1
        for i in num:
            val[i]=num[19:25]          #error
            print(i,val)

如果我不指定 val=0.000,则会出现此错误:name 'val' is not defined。 那是因为可能是本地声明而不是全局声明(这是我的看法),所以我最终将值分配给 'val'。

【问题讨论】:

  • 如果 val 是浮点数或未定义,则无法索引它。目前,这段代码似乎根本没有多大意义。在您的循环中,i 只是一个字符串,因此除非您将 val 转换为 dict,否则将其用作 val 的索引将不起作用。
  • 如果您在问题中解释您希望代码做什么,那么提供好的建议会更容易。有点不清楚。

标签: python loops methods


【解决方案1】:

我建议 - 请参阅答案末尾 - 基于对您可能试图实现的目标的合理猜测(尽管问题中并不完全清楚)的修改代码。

此代码将打开文件并循环遍历行,对于那些以'X-DSPAM-Confidence:' 开头的代码,它将提取相关的子字符串并将其转换为浮点值并打印它,并将其存储在名为@的列表中987654322@.

您调用的变量num 似乎打算包含一个字符串。这在语法上是有效的,但可能对读者没有帮助,因为名称暗示了不同的目的,因此这里将其重命名为 line

您的代码中有一个类似的问题,变量名为fname,其名称暗示它将包含文件名,但实际上包含open 函数返回的文件句柄。修改后的代码使用这个变量来包含名称本身;在这种情况下,实际的文件句柄不需要存储在变量中。

您遇到的具体错误是尝试索引一个名为 val 的浮点数。浮点数不是可以以这种方式使用的数据类型(项目分配),在这种特殊情况下,您可能打算使用列表。我在建议的代码中使用了一个名为values 的列表。可以使用例如values[i] = value 来分配其中的元素。但是,这只能用于更改列表中现有元素的内容,而不能更改列表的长度。要将另一个元素添加到循环内的列表中,您将改为调用 values 列表的 append 方法,传递一个参数,该参数是您要附加到列表的项目(我称之为 value) .

此代码假设字符串line[19:25] 中的数据可以转换为浮点数。如果不是这种情况(例如,它由字母字符组成),那么代码将报告错误并停止。如何处理该错误可能超出了这个问题的范围,但如果需要,可以这样做。

最后一个小注释:因为文件路径包含\ 字符,所以有必要在第一行的引号前加上r。这是为了防止\ 字符在字符串处理中作为转义字符具有特殊含义。

fname = r'C:\Program Files (x86)\Python38-32\mbox-short.txt'
count = 0
values = []
for line in open(fname, 'r'):
    if line.startswith('X-DSPAM-Confidence:'):
        count = count + 1
        value = float(line[19:25])
        values.append(value)
        print(count, value)

【讨论】:

    【解决方案2】:

    你不能对一个数字进行迭代,但你可以对一个数组进行迭代 如果你不需要val 就可以了

    for num in fname:
        if num.startswith('X-DSPAM-Confidence:'):
            count=count+1
            for i in num:
                print(i, num[19:25]) 
    

    如果你想要一张地图:

    count=0
    val={}
    for num in fname:
        if num.startswith('X-DSPAM-Confidence:'):
            count=count+1
            for i in num:
                val[i]=num[19:25]         
                print(i, val[i])
    

    【讨论】:

    • 谢谢,我这样做了,但随后显示此错误:val[i]=num[19:25] TypeError: list indices must be integers or slices, not str
    猜你喜欢
    • 2022-01-25
    • 2015-03-09
    • 2019-01-03
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    相关资源
    最近更新 更多