0

次のようなテーブルがあります。

id  value
AGA 0.211
AGA 0.433
AGA 0.123
AGH 0.002
DHI 0.063
DHI 0.193
DHI 0.004
KHI 0.543
KHI 0.064
HID 0.234

各 ID には異なる値が存在する場合があります。各 ID の入り口の数、各 ID の値の平均と合計を数えたいので、結果は次のようになります。

id      cnt   sum   av
AGA     3     0.76  0.25
AGH     1     0.002 0.002
DHI     3     0.26  0.008
KHI     2     0.607 0.304
HID     1     0.234 0.234 

最初に各エントリをカウントする辞書を作成するのが最善だと思いますが、辞書の値を配列(cnt、sum、avを使用)として持つのが最善かどうかわからず、その後行き詰まりました。次に、Cnt の範囲を使用して計算しましたが、それを行う方法を考えることができませんでした! これは私が得た距離です:

idDict = {}
for line in file:
    line = line.rstrip()
    f = line.split()
    id = f[0]
    idDict[id] = idDict.get(id, 0) + 1

しかし、ここで cnt を使用して既に辞書を作成している場合は、各 ID を反復処理して sum と av の計算を行う方法がわかりません:(

4

2 に答える 2

2

で始まる方法は次のdefaultdictとおりです。

from collections import defaultdict

mylist=[('AGA' ,0.211), ('AGA' ,0.433), ('AGA' ,0.123), ('AGH' ,0.002), 
        ('DHI', 0.063), ('DHI' ,0.193), ('DHI' ,0.004), ('KHI' ,0.543),
        ('KHI' ,0.064), ('HID' ,0.234)]

mydict = defaultdict(list)
for key, val in mylist:
    mydict[key].append(val)

summary = {}
for key, val in mydict.items():
    summary[key] = len(val), sum(val), sum(val)/len(val)

print summary
#Output:
{'KHI': (2, 0.60699999999999998, 0.30349999999999999), 
 'HID': (1, 0.23400000000000001, 0.23400000000000001), 
 'AGA': (3, 0.76700000000000002, 0.25566666666666665), 
 'DHI': (3, 0.26000000000000001, 0.08666666666666667), 
 'AGH': (1, 0.002, 0.002)}
于 2012-06-08T15:26:05.570 に答える
1

あなたのテーブルのデータはソートされているように見えるので、実際には最初にすべてを辞書に入れる必要はありませんが、それは物事をより明確にするかもしれません. しかし、あなたのテーブルはかなり大きくなる可能性があると思うので、すべてをもう一度保存することはリソースキラーです...

def sum_up(id, list):
    counted = len(list)
    summed = sum(list)
    avrg = summed/counted
    # print, insert or do whatever needed with the lines:
    print counted, summed, avrg

last_id = None
current = []
for line in file:
    (id, value) = line.split()
    if last_id != id:
        if last_id is not None:
            # evaluate last id
            sum_up(last_id, current)
            current = []
        # remember id
        last_id = id
    # append to current ids entries
    current.append(value)

# do the last id, if there is any:
if len(current) > 0:
    sum_up(last_id, current)

私はそのコードをテストしませんでしたが、アイデアは得られるはずです。少し複雑に見えますが、10 万行を超える場合は、最初にすべてをメモリにロードしてから作業するのとは違いを感じるはずです。

于 2012-06-08T15:39:14.287 に答える