繁体   English   中英

TypeError:-:“ str”和“ int”的不受支持的操作数类型

[英]TypeError: unsupported operand type(s) for -: 'str' and 'int'

现在,我的代码将创建一个文本文件,其中包括列表中句子中每个单词的位置以及列表中每个单词的位置,如下所示:

文件内容

然后,我的代码将打开该文件的备份,并且应该能够使用这些位置和文本文件中的单词来重新创建句子,但是由于某种原因,它似乎无法与readlines代码一起使用。

openfilename = open(openfilename,"r")
readlines = openfilename.readlines()

wordslist = readlines[0]
positionslist = readlines[1]

print(positionslist)
print(wordslist)

originalsentence = " ".join([wordslist[x-1] for x in positionslist])
print(originalsentence)

例如,这带有wordslist和positionslist,结果为:

[1, 2, 3, 2]
['test123', ',', '.']

好像我要使用的那样:

positionslist = [1, 2, 3, 2]
wordslist = ['test123', ',', '.']
originalsentence = " ".join([wordslist[x-1] for x in positionslist])
print(originalsentence)

它将起作用,而且我不知道为什么,因为,作为python的新手,您会认为它们会发挥相同的作用。 看着别人的帖子有同样的错误我应该错过了

(int(...)

某处的代码行,但是我不确定在哪里,或者甚至是问题所在。

编辑:此答案假定为“原始”格式。 它在这里行不通。 如果readlines[1]已经是通过分割像"1 4 5 6 7"这样的行而获得的字符串列表,那将是可行的,这里不是这种情况,因为line包含写为str(list)的python列表。 在这种情况下, 如果输入格式令人满意并且首先没有出现错误, ast.literal.eval是正确的选择。

当您这样做时:

positionslist = readlines[1]

除了包含整数的字符串列表之外,您别无选择。 您必须像这样转换它们:

positionslist = [int(x) for x in readlines[1]]

在您的硬编码示例中,您直接使用了整数并且它可以工作。

注意:正如cricket_007所建议的那样,由于您只需要迭代positionslist ,因此可以使用

positionslist = map(int,readlines[1])

它将int函数应用于readlines[1]每一项,返回一个可迭代(在Python 2中返回list ,因此与上面的列表理解没有太大区别)。

在Python 3中,这避免了创建/分配不需要的列表,因为您不使用索引(如果要调试它,则无法进行,因为您只能对其进行一次迭代),所以它更多表演者。

当然,如果某行不是数字,则将崩溃,并显示显式错误ValueError: invalid literal for int() with base 10

另一个解决方案是使用ast.literal_eval()将字符串u'[1, 2, 3, 2] ast.literal_eval() u'[1, 2, 3, 2]直接转换为整数列表:

import ast

with open(openfilename, "r") as f:
    positionslist = ast.literal_eval(f.readline())
    wordslist = ast.literal_eval(f.readline())

    print(" ".join([wordslist[x-1] for x in positionslist]))

同样,用with语句替换try and catch。 阻止之后,它也会自动关闭文件。

问题是,当您从文件中读取时,默认情况下值是str类型的。 当您尝试在[wordslist[x-1] for x in positionslist]x-1时,会出错,因为您尝试从字符串中subtract 1。 为了解决此问题,请将positionslist转换为int的列表,如下所示:

positionslist = readlines[1]
positionslist = map(int, positionslist) # <-- add this line in your code 

这样您的代码就会起作用。 检查map()以了解它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM