TypeError:不支持的操作数类型 - :' str'和' int'

时间:2016-09-22 20:59:32

标签: python

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

file content

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

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(...)

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

3 个答案:

答案 0 :(得分:2)

编辑:这个答案假定一个" raw"格式。它不会在这里工作。如果readlines[1]已经是通过拆分像"1 4 5 6 7"这样的行获得的字符串列表,工作,这不是这里的情况,因为行包含写入的python列表作为str(list)。在这种情况下,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

而崩溃

答案 1 :(得分: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和catch。它还会在阻止后自动关闭文件。

答案 2 :(得分:0)

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

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

您的代码将有效。检查map()以了解相关信息。