1

次のような統計ファイルがあります。

dict-count.txt

apple   15
orange  12
mango   10
apple   1
banana  14
mango   4

各要素の数を数えて、次のような辞書を作成する必要があります{'orange': 12, 'mango': 14, 'apple': 16, 'banana': 14}。これを達成するために次のことを行います。

from __future__ import with_statement

with open('dict-count.txt') as f:
    lines = f.readlines()

output = {}

for line in lines:
    key, val = line.split('\t')
    output[key] = output.get(key, 0) + int(val)

print output

私が特に気になっているのは、次の部分です。

key, val = line.split('\t')
output[key] = output.get(key, 0) + int(val)

これを行うより良い方法はありますか?それともこれが唯一の方法ですか?

ありがとう。

4

2 に答える 2

4

小さなファイルの場合は を使用できますが.readlines()、ファイルの内容全体を一度にメモリに丸呑みします。これは、file オブジェクトfを反復子として使用して記述できます。反復すると、一度に 1 行の入力が得られます。

したがって、これを記述する最も簡単な方法は、defaultdict@Amber が既に示したように a を使用することですが、私のバージョンでは入力行のリストを作成しません。そのままディクショナリを構築するだけです。

dの代わりに dict のように、簡潔な変数名を使用しましたoutput

from __future__ import with_statement
from collections import defaultdict
from operator import itemgetter

d = defaultdict(int)

with open('dict-count.txt') as f:
    for line in f:
        k, v = line.split()
        d[k] += int(v)

lst = d.items()

# sort twice: once for alphabetical order, then for frequency (descending).
# Because the Python sort is "stable", we will end up with descending
# frequency, but alphabetical order for any frequency values that are equal.
lst.sort(key=itemgetter(0))
lst.sort(key=itemgetter(1), reverse=True)

for key, value in lst:
    print("%10s| %d" % (key, value))
于 2012-04-14T03:15:05.357 に答える
3

次を使用しdefaultdictます。

from __future__ import with_statement
from collections import defaultdict

output = defaultdict(int)

with open('dict-count.txt') as f:
    for line in f:
        key, val = line.split('\t')
        output[key] += int(val)

print output
于 2012-04-14T03:06:52.367 に答える