1

これは、Think Python からのものです。ファイルの各行 (各行に 1 つの単語) を調べて、文字 e を含まないすべての単語のみを出力しようとしています。関数を介してファイルをフィルタリングするさまざまな方法を試すのに4時間ほど費やしましたが、あきらめました。単語で見つかった最初のeのみを除外するようです:単語に2つの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 に答える