1

这是来自 Think Python。试图遍历文件的每一行(每行一个单词)并且只打印出每个不包含字母 e 的单词。我花了大约 4 个小时尝试不同的方法来通过我的函数过滤文件,但我放弃了。似乎它只过滤掉它在一个单词中找到的第一个 e:如果一个单词有两个 e,那么它会打印它反正出去。

def has_no_e():
    file_name = raw_input('Enter the full path and file name: ') 
    fin = open(file_name)   
    line = fin.readline()

    for line in fin:
        word = line.strip()
        print word
        for letter in word:
            if letter == 'e':
                continue
            print word




    has_no_e()

顺便说一句,我的代码缩进了,我认为当我 ctrl + v 时它搞砸了

如果有办法缩短我的代码,请告诉我:]

4

2 回答 2

5
with open(filename) as f:
    for line in f:
        if not 'e' in line: print line.strip()

一些评论:

  • 在处理文件时使用 with,虽然它是 python 中的一个较新的构造,但它可以帮助您管理文件(即在不再需要时再次关闭它)
  • word = line.strip()使您的代码不太可读。使用line = line.strip()(我假设你只会使用一个lineword,而不是两者)

那么为什么你的代码不起作用?

for letter in word:
    if letter == 'e':
        continue
    print word

在这里,您将单词拆分为字母,然后检查字母是否等于e。如果不是这样,你打印这个词,否则你跳到下一个字母。因此,您打印该单词的次数与有与“e”不同的字母一样多。

解决这个问题的一种方法是定义一个布尔值,它告诉你单词中是否有 e:

hasE = False
for letter in word:
    if letter == 'e':
        hasE = True
        break
if not hasE: print word

请注意,Python 也有一种奇特的方式来解决这样的问题:

for letter in word:
    if letter == 'e': break
else:
    print word
于 2013-06-04T12:36:11.000 回答
0

看起来 pfnuesel 在他写的时候已经解决了代码不起作用的主要原因:

“在这里,您将单词拆分为字母,然后检查该字母是否等于 e。如果不是,则打印该单词,否则跳转到下一个字母。因此,您打印该单词的次数与那里一样多是不同于‘e’的字母。”

这是我在 Think Python 中解决练习 9.2 的方法:

def has_no_e(word):
    return "e" not in word

fin = open('words.txt')

for line in fin:
    word = line.strip()
    if has_no_e(word):
        print word
于 2014-08-24T19:35:45.237 回答