现在我的代码将创建一个文本文件,其中包括列表中每个单词的位置,以及列表中的每个单词 - 如下所示:
我的代码然后打开备份文件,并且应该能够使用文本文件中的那些位置和单词重新创建句子,但由于某种原因它似乎不能与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(...)
某处的代码行,但我不确定在哪里,或者是否甚至是问题。
答案 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()
以了解相关信息。