3

次のコードでは、次を使用する場合:

for line in fin:

「a」に対してのみ実行されます

しかし、私が使用する場合:

wordlist = fin.readlines()
for line in wordlist:

次に、a から z まで実行します。

しかしreadlines()、ファイル全体を一度に読み取ります。これは望ましくありません。

これを回避する方法は?

def avoids():
    alphabet = 'abcdefghijklmnopqrstuvwxyz'
    num_words = {}

    fin = open('words.txt')

    for char in alphabet:
      num_words[char] = 0
      for line in fin:
        not_found = True
        word = line.strip()
        if word.lower().find(char.lower()) != -1:
          num_words[char] += 1
    fin.close()
    return num_words
4

3 に答える 3

8

構文for line in finは一度しか使用できません。それを行うと、ファイルが使い果たされ、fin.seek(0). 逆に、fin.readlines()何度も繰り返すことができるリストを提供します。


Counter(python2.7+)を使用した単純なリファクタリングにより、この頭痛が解消されると思います。

from collections import Counter
with open('file') as fin:
    result = Counter()
    for line in fin:
        result += Counter(set(line.strip().lower()))

これは、特定の文字を含むファイル内の単語数 (1 行あたり 1 単語) をカウントします (これは、元のコードが私が信じていることです...間違っている場合は修正してください)

defaultdict(python2.5+)を使用してこれを簡単に行うこともできます:

from collections import defaultdict
with open('file') as fin:
    result = defaultdict(int)
    for line in fin:
        chars = set(line.strip().lower())
        for c in chars:
            result[c] += 1

setdefaultそして最後に、それを古い学校に蹴ります-いつ導入されたのかさえわかりません...:

fin = open('file')
result = dict()
for line in fin:
    chars = set(line.strip().lower())
    for c in chars:
        result[c] = result.setdefault(c,0) + 1

fin.close()
于 2012-11-07T07:12:25.513 に答える
5

次の 3 つのオプションがあります。

  1. とにかくファイル全体を読み込みます。
  2. 再度反復を試行する前に、ファイルの先頭に戻ってシークします。
  3. ファイルを複数回反復する必要がないように、コードを再構築します。
于 2012-11-07T07:12:39.740 に答える
0

試す:

from collections import defaultdict
from itertools import product

def avoids():
    alphabet = 'abcdefghijklmnopqrstuvwxyz'

    num_words = defaultdict(int)

    with open('words.txt') as fin:
        words = [x.strip() for x in fin.readlines() if x.strip()]

    for ch, word in product(alphabet, words):
        if ch not in word:
             continue
        num_words[ch] += 1

    return num_words
于 2012-11-07T07:16:22.770 に答える