Think Python 中的 has_no_e() 练习

KOM*_*OME 1 python filter

这是来自 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()
Run Code Online (Sandbox Code Playgroud)

我的代码是缩进的,我认为当我 ctrl + v 时它会搞砸

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

pfn*_*sel 5

with open(filename) as f:
    for line in f:
        if not 'e' in line: print line.strip()
Run Code Online (Sandbox Code Playgroud)

一些评论:

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

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

for letter in word:
    if letter == 'e':
        continue
    print word
Run Code Online (Sandbox Code Playgroud)

在这里,您将单词拆分为字母,然后检查该字母是否等于e。如果不是这种情况,则打印该单词,否则跳至下一个字母。因此,您可以多次打印与“e”不同的字母。

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

hasE = False
for letter in word:
    if letter == 'e':
        hasE = True
        break
if not hasE: print word
Run Code Online (Sandbox Code Playgroud)

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

for letter in word:
    if letter == 'e': break
else:
    print word
Run Code Online (Sandbox Code Playgroud)