2

ホッケーの統計を含む非常に大きなテキスト ファイルがあります。

各行から 2 つのものが必要です。

  1. プレイヤーの名前
  2. ポイント (最初の数字のセット)

そして、トップ 10 リストを返したいと思います。

以下はテキスト ファイルのサンプルですが、さらに長く続きます。

html_log:Bob 1217.1 1.75 696:48 1 5 38 6 109 61 14:42 633 223 25 435:36 182 34 0.55    
html_log:Steve 485.5 1.26 385:18 7 12 -1 28 172 218 16:04 839 94 101 143:18 44 15 -0.03
html_log:Jim 1153.3 1.84 625:54 1 2 71 3 2 10 7:58 499 3 5 616:36 241 36 1.13 

-より多くのプレーヤーと統計で繰り返します(改行なし)

プレーヤー名を取得する必要があります。この場合、"html_log" タグに続くテキストです。最初の数字のセットも必要で、トップ 10 リストを返すために出力する必要があります。

最適な結果が出力されます

->>

Bob 1217.1
Jim 1153.3
Steve 485.5

+ テキスト ファイル内の残りのユーザーとその評価 (最高から最低)。または、テキスト ファイルの上位 10 件のみ。

4

3 に答える 3

6

それを小さな断片に分解するだけで、それぞれが簡単です.

英語で: ファイルの各行について、最初の 2 つの値が必要で、コロンの後に最初の値を分割し、2 番目の値を数値として扱いたいとします。次に、その 2 番目の値で並べ替えられた上位 10 のペアを追跡します。

Python の場合:

with open('large_file.txt') as f:
    pairs = (line.split()[:2] for line in f)
    processed_pairs = ((pair[0].split(':')[1], float(pair[1])) for pair in pairs)
    top_10_pairs = heapq.nlargest(10, processed_pairs, key=operator.itemgetter(1))

listこれで , のnameペアscoreが得られました。これは簡単に印刷できます:

for name, score in top_10_pairs:
    print('{} {}'.format(name, score))

ファイルがどんなに大きくても、ファイル (ファイル) でいっぱいのイテレータを変換しているだけなので、一度に 10 を超える処理されたペア (および読み取りバッファとその他の基本的なもの) をメモリに保持することはできません。ステップバイステップで他のイテレータに入りheapq.nlargest、それをにフィードしnます。

于 2013-05-28T08:32:47.713 に答える
2
dict(line.split()[:2] for line in
    [line.split(":")[1] for line in data.split("\n")])
#  {'Bob': '1217.1', 'Jim': '1153.3', 'Steve': '485.5'}
于 2013-05-28T08:29:13.107 に答える
-3

The following code does exactly what you wanted to do:

filin = open('file','r')

d = {}

for i in filin:

    startName = i.find('html_log:') + len('html_log:')

    endName = i.find(' ',startName)

    name = i[startName:endName]

    startPoint = endName + 1

    endPoint = i.find(' ',startPoint)

    points = i[startPoint:endPoint]

    d[points] = name

d.keys().sort()

counter = 0  ##to make sure that we print only the top 10

filin.close()

for key in d.keys():


    print d[key],' ',key

    counter += 1

    if counter == 10:

        break
于 2013-05-28T08:35:53.967 に答える