0

私の宿題では、テキストで最も頻繁に使用される 50 の単語を分離する必要があります。私は多くのことを試しましたが、最近の試みでは、これを使用して一致を達成しました:

concordance = {}

lineno = 0

for line in vocab:

    lineno = lineno + 1

    words = re.findall(r'[A-Za-z][A-Za-z\'\-]*', line)
    for word in words: 
        word = word.title()
        if word in concordance:
            concordance[word].append(lineno)
        else: 
            concordance[word] = [lineno]
listing = []

for key in sorted(concordance.keys()):

    listing.append( [key, concordance[key] ])

私が知りたいのは、後続のコンコーダンスを最も頻繁に使用される単語から最も頻繁に使用されない単語の順に並べ替えてから、上位 50 を分離して出力できるかどうかです。reと以外のモジュールをインポートすることは許可されておらずsys、解決策を考え出すのに苦労しています。

4

2 に答える 2

1

sortedインポートを必要としないビルトインです。次のようなものを試してください:

list(sorted(concordance.items(), key = lambda (k,v): v))[:50]

テストされていませんが、アイデアはわかります。

listコンストラクターが存在するのは、直接スライスできないジェネレーターを返すためですsorted(それitertoolsを行うためのユーティリティを提供しますが、インポートすることはできません)。

最初の 50 を取得するためのもう少し効率的な方法があるかもしれませんが、ここでそれが問題になるとは思えません。

于 2012-05-16T12:24:01.517 に答える
0

いくつかのヒント:

  • for ループで使用enumerate(list)して、行番号と行を一度に取得します。
  • \wlistではなく、正規表現で for word 文字を使用してみてください[A-Za-z...]
  • dict.items()メソッドについて読んでください。(key, value)ペアのリストが返されます。
  • そのリストを で操作しますlist.sort(key=function_to_compare_two_items)
  • その関数を で定義できますが、lambda必須ではありません。
  • 関数を使用してlen(list)、リストの長さを取得します。これを使用して、(リストに格納されている) 単語の一致数を取得できます。
  • UPDATE :そうそう、スライスを使用して、結果のリストの一部を取得します。list[:50]最初の 50 項目 ( と同等list[0:50])list[5:10]を取得し、インデックス 5 を含む項目からインデックス 10 を除く項目を取得します。
  • それらを印刷するには、結果のリストをループしてから、すべての単語を印刷します。または、同様のものを使用してprint '[separator]'.join(list)、すべての項目を '[separator]' で区切った文字列を出力できます。

幸運を。

于 2012-05-16T12:50:38.657 に答える