我是机器学习的新手。尝试将int用于字母时遇到一些问题。我在Mac OS上使用Python 3.5。这是我的代码:



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()
        listFromLine1 = line.split('\t')
        listFromLine = zeros(3)
        i = 0
        for value in listFromLine1:
            if value.isdigit():
                valueAsInt = int(value)
                listFromLine[i] = valueAsInt
                i += 1
        returnMat[index, :] = listFromLine[0:3]
        classLabelVector.append(int(listFromLine1[-1]))
        index += 1
    return returnMat, classLabelVector


这是我的txt文件:

23  8   1   f
7   8   5   j
5   9   1   j
6   6   6   f


这是错误:

  classLabelVector.append(int(listFromLine1[-1])) ValueError: invalid literal for int() with base 10: 'f'


有人可以帮我解决这些问题吗?

最佳答案

如果我正确理解了所需的结果,则需要返回一个包含n个列表的列表。每个列表将沿[23。 8. 1.]。然后,您需要第二个列表,该列表采用每个列表的最后一个数字,例如:[1、5、1、6]。

假设这都是正确的,则得到classLabelVector.append(int(listFromLine1[-1])) ValueError: invalid literal for int() with base 10: 'f'的原因是因为您没有返回任何数字,而是返回了一个字符串。我发现了3个应该可以修复错误的问题。

首先,我在您的文本文档中没有找到'\ t'。我改用listFromLine1 = line.split(' '),它根据空格进行拆分。不过,这可能只是来自发布时复制的方式。

其次,当为listFromLine中的每个位置分配一个值时,您将忽略它并从您未做任何事情的listFromLine1追加,因此它仍然是一个字符串。

第三,尝试使用if value.isnumeric():代替if value.isdigit():

解决这些问题应该可以使程序正常工作。另外,您打开文件并运行fr.readlines()两次,并且永远不要告诉它关闭。对于相同的信息,您使程序工作两次。您应该尝试将其重写为仅打开一次并使用with open() as fr:,因为完成后它将关闭。

编辑:如果您希望第二个列表是字母而不是[f,j,j,f],则将其保留为listFromLine1并使用str()而不是int():classLabelVector.append(str(listFromLine1[-1]))

10-06 12:14