2

私はPythonの初心者で、リスト内包表記を勉強しています。

私がやろうとしているのは、次のコードをリスト内包表記に変換することです。

def words_without_e():
    count = 0

    words = open('words.txt')
    for word in words:
        if word.find('e') == -1:
            count += 1
    words.close()

    return count

これが私の弱い試みです:

words = open('words.txt')
print sum([1 for word in words if word.find('e') == -1])

しかし、残念ながらそれは機能していません。私が得ることを期待している答えは37641ですが、私は0を得ています。:(

同じことを行う別のコードを作成しようとしましたが、ソースとしてのファイルの代わりに、リストを使用しました。

def test():
    words = ['hello', 'world', 'ciao']
    return sum([1 for word in words if word.find('e') == -1])

そしてそれは動作します。

私はこの「かなり」類似したSO投稿を見て、そこに投稿されたコードを試しましたreturn len([word for word in words if len(word) >= 2 and word[0] == word[-1]])。ソースがハードコードされたリストの場合は機能しますが、ソースが外部ファイルの場合は失敗します。

さて、私の質問は、リストsumとタプルでのみ機能するのでしょうか?ドキュメントを正しく理解していれば、反復可能なものをまとめることができます。

どんな啓蒙も大歓迎です。:)

4

3 に答える 3

7

最も簡単な解決策はこれです:

with open("words.txt") as words:
  sum(1 for word in words if "e" not in word)

ご覧のとおりsum、どのイテレータでも機能します。ここでは、ジェネレータ式を使用しています。

文字列はそれ自体が反復可能であり、をサポートしているので、実行するのではなく、読みやすく、機能word.find('e') == -1するだけで実行できます。"e" not in word__contains__

また、このwithステートメントを使用してファイルを開きます。これは、ファイルを手動で開いたり閉じたりするよりも、それらを処理し、例外も正しく処理するため、望ましい方法です。

ただし、あなたの例は私にとってはうまくいきます。私の推測では、ファイルはスペースまたはコンマで区切られていますが、ファイルをループすると行が返されます。

私のテストファイル:

bob
bill
james
test
something
no

たとえば、これは機能しません。

bob bill james test something no

すべてを含む1つの文字列を取得します。この場合、を使用str.split()して行を単語に分割できます。

例えば:

with open("words.txt") as lines:
    sum(1 for line in lines for word in line.split() if "e" not in word)
于 2012-04-11T09:22:42.230 に答える
1

私はこれを試しましたが、それは機能するので、ファイルのフォーマット方法と関係がある可能性があります。

me@pc:~/Desktop$ cat > words.txt
app
noot
mies
wim
zus
jet
me@ps:~/Desktop$ python
Python 2.6.6 (r266:84292, Dec 26 2010, 22:31:48) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> sum(1 for word in open('words.txt') if 'e' not in word)
4
于 2012-04-11T09:26:08.350 に答える
0

わかった。@Lattywareが書いたコードを試してみましたが、正常に機能しています。なぜそのように振る舞うのかはわかりませんが、私はすでに犯人を見つけたと思います。それは別の質問になると思います。:)

def count_words():
    with open("words.txt") as words:
        print sum(1 for word in words)
        print sum(1 for word in words if "e" not in word)


>>> count_words()
113809
0

しかし、最初の印刷ステートメントをコメントアウトすると、答えが正しく表示されます。

>>> count_words()
37641

アップデート:

他の誰かが同じ問題に遭遇した場合に備えて、私が思いついた解決策を投稿しています。

def count_words():
    total = 0
    wordsWithoutE = 0

    with open("words.txt") as words:
        for word in words:
            if 'e' not in word:
                wordsWithoutE += 1

            total += 1

    return (total, wordsWithoutE)


    >>> print count_words()
    (113809, 37641)
于 2012-04-11T09:50:28.933 に答える