0

私は現在、単語のインデックスを作成しようとしており、テキスト ファイルから各行を読み取り、単語がその行にあるかどうかを確認しています。そうであれば、数行を出力し、チェックを続けます。各単語と行番号を印刷するときに希望どおりに機能するようになりましたが、各番号を格納するためにどのストレージシステムを使用できるかわかりません.

コード例:

def index(filename, wordList):
    'string, list(string) ==> string & int, returns an index of words with the line number\
    each word occurs in'
    indexDict = {}
    res = []
    infile = open(filename, 'r')
    count = 0
    line = infile.readline()
    while line != '':
        count += 1
        for word in wordList:
            if word in line:
                #indexDict[word] = [count]
                print(word, count)
        line = infile.readline()
    #return indexDict

これは単語とその時点でのカウント(行番号)が何であれ印刷しますが、私がやろうとしているのは、後で印刷できるように数字を保存することです

word linenumber

word2 linenumber, linenumber

等々。各キーに複数の値を含めることができるように、各行番号をリスト内に配置すると、辞書が機能すると感じましたが、最も近いものは次のとおりです。

{'mortal': [30], 'dying': [9], 'ghastly': [82], 'ghost': [9], 'raven': [120], 'evil': [106], 'demon': [122]}

次のように表示したいとき:

{'mortal': [30], 'dying': [9], 'ghastly': [82], 'ghost': [9], 'raven': [44, 53, 55, 64, 78, 97, 104, 111, 118, 120], 'evil': [99, 106], 'demon': [122]}

何か案は?

4

4 に答える 4

3

次のようなことを試してください:

import collections
def index(filename, wordList):
    indexDict = collections.defaultdict(list)
    with open(filename) as infile:
        for (i, line) in enumerate(infile.readlines()):
            for word in wordList:
                if word in line:
                    indexDict[word].append(i+1)
    return indexDict

これにより、例とまったく同じ結果が得られます(Poe's Ravenを使用)。

dictまたは、 a の代わりに法線を使用してdefaultdict、リスト内のすべての単語で初期化することを検討することもできます。indexDictテキストにない単語であってもエントリが含まれていることを確認します。

の使用にも注意してくださいenumerate。この組み込み関数は、あるリストのインデックスとそのインデックスにある項目 (ファイル内の行など) の両方を反復処理する場合に非常に便利です。

于 2013-03-10T21:17:02.367 に答える
2

古い値をこの行に置き換えています

indexDict[word] = [count]

に変更する

indexDict[word] = indexDict.setdefault(word, []) + [count]

あなたが望む答えを生み出すでしょう。indexDict [word]の現在の値を取得し、それに新しいカウントを追加します。indexDict[word]がない場合は、新しい空のリストを作成し、それにカウントを追加します。

于 2013-03-10T21:20:56.283 に答える
2

これを書くにはおそらくもっと Pythonic な方法がありますが、読みやすくするために、これを試すことができます (簡単な例):

dict = {1: [], 2: [], 3: []}

list = [1,2,2,2,3,3]

for k in dict.keys():
    for i in list:
        if i == k:
            dict[k].append(i)


In [7]: dict
Out[7]: {1: [1], 2: [2, 2, 2], 3: [3, 3]}
于 2013-03-10T21:19:27.887 に答える
1

リストがすでに存在する場合は、次のアイテムをリストに追加する必要があります。

初めて単語を見つけた場合でもリストを既に存在させる最も簡単な方法は、collections.defaultdictクラスを使用して単語から行へのマッピングを追跡することです。

from collections import defaultdict

def index(filename, wordList):
    indexDict = defaultdict(list)
    with open(filename, 'r') as infile:
        for i, line in enumerate(infile):
            for word in wordList:
                if word in line:
                    indexDict[word].append(i)
                    print(word, i)

    return indexDict

ベストプラクティスを使用して、コードを少し簡略化しました。ファイルをコンテキストマネージャーとして開いて、完了すると自動的に閉じるようにし、を使用enumerate()してその場で行番号を作成します。

set(line.split())行を単語のセットに変換した場合(おそらく、句読点は削除されません)、これをさらにもう少しスピードアップできます(そしてより正確になりますwordList) 。 set)、これは一致する単語を見つけるのにかなり速くなる可能性があります。

于 2013-03-10T21:20:04.740 に答える