TypeError:不支持的操作数类型为 - :'str'和'int'
现在,我的代码将创建一个文本文件,其中包括列表中每个单词的位置以及列表中的每个单词 - 像这样:TypeError:不支持的操作数类型为 - :'str'和'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(...)
行代码的地方,但我不知道在哪里,或者如果这是连问题。
另一种解决方案是使用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。它也会在块后自动关闭文件。
你是唯一一个真正打开输入图像的人。好的问题格式不好。但无论如何都是很好的答案 –
@ Jean-FrançoisFabre感谢您使堆栈溢出社区更好:) –
编辑:这个答案假设一个“原始”格式。它不会在这里工作。它将工作,如果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
或'positionslist = map(int,readlines [1])' –
是的,即使在python 3中也可以工作,因为我们使用列表仅仅用于迭代,而不用于索引。编辑它。 –
由于我的防火墙,我看不到您的文件格式。将输入文件作为文本发布会更好。在这种情况下,您需要使用ast.literal_eval()来直接在Python中解释列表,正如Max Chretien所建议的那样。这可能是因为你使用python和'str(yourlist)'编写了输入文件,而不是逐个写入你的值。 –
的问题是崩溃,当你从文件中读取,该值是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()
了解它。
某些*用户不会打开随机链接,而应该粘贴图像。在这种情况下,屏幕截图是过分的,因为它只有两行,因此描述文件中的内容实际上更简单。因为@ Jean-FrançoisFabre无法正确回答你的问题。无论如何,我很高兴能有所帮助。欢迎来到*! –
@MaxChrétien我的截图不好,我会记住我的未来问题。顺便谢谢你的帮助,我很感激。 – Mika1996