Python TypeError:';的操作数类型不受支持;str';和';int';

Python TypeError:';的操作数类型不受支持;str';和';int';,python,Python,现在,我的代码将创建一个文本文件,包括列表中句子中每个单词的位置,以及列表中每个单词的位置,如下所示: 然后,我的代码打开备份文件,应该能够使用这些位置和文本文件中的单词重新创建句子,但由于某种原因,它似乎无法与readlines代码一起使用 openfilename = open(openfilename,"r") readlines = openfilename.readlines() wordslist = readlines[0] positionslist = readlines[

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

然后,我的代码打开备份文件,应该能够使用这些位置和文本文件中的单词重新创建句子,但由于某种原因,它似乎无法与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”
这样的行而获得的字符串列表,那么它就可以工作了,因为该行包含一个写为
str(list)
的python列表<在这种情况下,如果输入格式令人满意且一开始不是错误,那么code>ast.literal.eval是正确的选择

当您这样做时:

positionslist = readlines[1]
除了包含整数的字符串列表之外,你不可能得到其他东西。例如,您必须将其转换为:

positionslist = [int(x) for x in readlines[1]]
在您的硬编码示例中,您直接使用整数,它可以工作

注意:正如cricket_007所建议的,由于您只需迭代
位置列表
,因此可以使用

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

在Python3中,这避免了创建/分配一个不需要的列表,因为您不使用索引(如果您想调试它,您不能调试它,因为您只能对它迭代一次),因此它的性能更高


当然,如果某行不是数字,它将崩溃,并出现显式错误
ValueError:invalid literal for int(),以10为基数

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

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

positionslist=map(int,positionslist)#另一种解决方案是将字符串
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]))

此外,该语句还替换了try-and-catch。它还会在块之后自动关闭文件。

是的,即使在Python3中也可以这样做,因为我们使用列表只是为了迭代,而不是索引。正在编辑。由于我的防火墙,我看不到你的文件格式。最好将输入文件作为文本发布。在这种情况下,您需要使用
ast.literal\u eval()
直接在python中解释列表,正如Max Chretien所建议的那样。这可能是因为您使用python和
str(yourlist)
编写了输入文件,而不是逐个编写值。您是唯一真正打开输入图像的人。好的,问题格式不好。不过答案还是不错。@Jean-François Fabre感谢您让stack Overflow社区变得更好:)有些stack Overflow用户不会打开随机链接,您应该粘贴您的图像。在这种情况下,一个屏幕截图是多余的,它实际上更简单地描述什么在您的文件,因为它只有两行。正因为如此,@Jean-François Fabre一开始无法正确回答你的问题。不管怎样,我很高兴能得到帮助。欢迎来到Stackoverflow@MaxChrétien我对截图的看法不好,我会记住这一点,以便将来提问。非常感谢你的帮助,顺便说一句,我很感激。