【问题标题】:Python: using int() on a string that is not an integer literalPython:在不是整数文字的字符串上使用 int()
【发布时间】:2014-01-24 08:24:21
【问题描述】:

注意:我为我的数据使用了错误的源文件 - 一旦修复,我的问题就解决了。事实证明,没有简单的方法可以在不是整数文字的字符串上使用 int(..)。

这是《机器学习实战》一书中的一个例子,我不太清楚哪里出了问题。这里有一些背景:

from numpy import as *

def file2matrix(filename):
    fr = open(filename)
    numberOfLines = len(fr.readlines())
    returnMat = zeros((numberOfLines,3))
    classLabelVector = []
    fr = open(filename)
    index = 0
    for line in fr.readlines():
        line = line.strip()
        listFromLine = line.split('\t')
        returnMat[index,:] = listFromLine[0:3]
        classLabelVector.append(int(listFromLine[-1])) # Problem here.
        index += 1
    return returnMat,classLabelVector

.txt文件如下:

40920   8.326976    0.953952    largeDoses
14488   7.153469    1.673904    smallDoses
26052   1.441871    0.805124    didntLike
75136   13.147394   0.428964    didntLike
38344   1.669788    0.134296    didntLike
...

我在classLabelVector.append(int(listFromLine[-1])) 行出现错误,因为我相信int(..) 正试图解析一个不是文字整数的字符串(即"largeDoses")。我错过了什么吗?

我查阅了 int() 的文档,但它似乎只解析数字和整数文字:

http://docs.python.org/2/library/functions.html#int

此外,本书的摘录对此部分的解释如下:

最后,您循环遍历文件中的所有行,并使用 line.strip() 去除返回行字符。接下来,你分割线 进入由制表符分隔的元素列表:'\t'。你拿 前三个元素并将它们推到矩阵的一行中,并且 你使用负索引的 Python 特性来获取最后一项 从列表中放入 classLabelVector。你必须明确 告诉解释器你想要最后一个的整数版本 列表中的项目,否则它将为您提供字符串版本。通常, 您必须这样做,但 NumPy 会为您处理这些细节。

【问题讨论】:

    标签: python string numpy


    【解决方案1】:

    诸如“largeDoses”之类的字符串无法转换为整数。在that code project 的文件夹Ch02 中,您有两个数据文件,使用第二个datingTestSet2.txt 而不是加载第一个

    【讨论】:

    • 哇,谢谢 - 我没有看到其他文件。我可能会关闭这个问题,因为它看起来微不足道。
    【解决方案2】:

    您可以使用ast.literal_eval 并捕获异常 ValueError 格式错误的字符串(顺便说一下 int('9.4') 会引发异常)

    【讨论】:

      猜你喜欢
      • 2017-05-25
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多