您似乎并不关心i 的值是多少。您只是将它用作配对lines 和words 的一种方式。因此,我建议你一次读一行,同时读一个单词。然后他们会匹配。
此外,当您使用.readlines() 时,您会一次将所有输入读入内存。对于大输入,这将很慢。对于这个简单的代码,一次一行就足够了。 open() 返回的文件对象可以作为迭代器,一次返回一行。
如果可以,您应该避免使用eval()。在一个你知道输入数据是什么的简单练习中,它是相当安全的,但是如果你从外部来源获取数据,使用eval() 可能会让你的计算机受到攻击。请参阅this page 了解更多信息。我将编写我的示例代码,假设您使用eval() 将文本转换为float 值。 float() 也适用于整数字符串值:float('3') 将返回 3.0。
此外,输入行似乎只能有两个值。如果一行有额外的值,您的代码将不会检测到这种情况。我们可以更改代码以显式地从拆分行解包两个值,然后如果有两个以上的值,Python 将引发异常。另外,代码会稍微好读一些。
所以这是我对这个例子的建议重写:
lines = open('wordprob.txt','rt')
words = open('StdWord.txt','rt')
for line in lines:
word = words.next().strip() # in Python 3: word = next(words).strip()
a, b = [float(s) for s in line.split()]
if a > b:
print word, # in Python 3: print(word + ' ', end='')
编辑:这是相同的解决方案,但使用izip()。
import itertools
lines = open('wordprob.txt','rt')
words = open('StdWord.txt','rt')
# in Python 3, just use zip() instead of izip()
for line, word in itertools.izip(lines, words):
word = word.strip()
a, b = [float(s) for s in line.split()]
if a > b:
print word, # in Python 3: print(word + ' ', end='')
在 Python 3 中,内置的 zip() 返回一个迭代器,因此您可以直接使用它而不需要 import itertools。
编辑:
无论如何,最好使用with 语句来确保正确关闭文件。在最新版本的 Python 中,您可以有多个 with 语句,我将在我的解决方案中这样做。此外,我们可以像解压列表一样轻松地解压生成器表达式,因此我将设置a, b 的行更改为使用生成器表达式;那应该稍微快一点。而且我们不需要剥离word,除非我们要使用它。将更改放在一起得到:
from itertools import izip
with open('wordprob.txt','rt') as lines, open('StdWord.txt','rt') as words:
# in Python 3, just use zip() instead of izip()
for line, word in izip(lines, words):
a, b = (float(s) for s in line.split())
if a > b:
print word.strip(), # in Python 3: print(word.strip() + ' ', end='')