2

私のデータはタブ区切りで、次のようになります。

Name   Count    Sample
Dog    .0001    1
Dog    .00003   1
Dog    .0001    2
Cat    .0004    1
Cat    .0002    1
Cat    .0003    2
Cat    .0002    2

変数 unid を 3 番目の列 (例: Dog_1) とマージされた最初の列として定義し、その行のカウントとして num を定義した後、次のように (Python 2.7 を使用して) unid の下の辞書に各 num を追加します。

for line in K:
        sp = line.split("\t")
        name = sp[0]
        unid = sp[3][:-2] +"_"+ sp[0]
        num = int(Decimal(sp[1]))
        if not dict1.has_key(unid):
            dict1[unid] = []
        dict1[unid].append(num)

私はこれでそれを要約しようとします:

dictTot = sum(dict1.values())

しかし、私はこのエラーメッセージを受け取ります:

TypeError: unsupported operand type(s) for +: 'int' and 'list'

これらの値を合計して取得できるようにするにはどうすればよいCat_1: .0006, Cat_2: .0005 ですか?

申し訳ありませんが、私は私の ? 素晴らしいではありません。しかし、以下のジェイコブが述べているように、「dictTot = sum(sum(value) for value in dict1.values())」はすべての合計を合計しますが、私が探しているのは、各キーの下の値の各グループを個別に合計することです。サンプル 1 などに含まれる猫の数を調べることができます。おそらく合計はこれに適していませんか?申し訳ありませんが、明らかなように、私は並外れた Python ではありません。

4

5 に答える 5

2

それはうまくいきませんsum。一連のリストを「追加」して整数(または数値型)を取得しようとしているため、組み込み関数が異常になります。代わりにこれを試してください:

dictTot = sum(sum(value) for value in dict1.values())

それはあなたが望むものであるすべての合計を合計します(私は思います)。

編集

リストの各要素のすべての値を合計したいようです。そのために、辞書内包表記を使用できます。

dictTot = {key:sum(l_values) for key, l_values in dict1.items()}
于 2012-06-29T20:01:31.430 に答える
1

大まかに全部書き直しました…

K = "Dog    .0001    1\n  Dog    .00003   1\n  Dog    .0001    2\n  Cat    .0004   1\n  Cat    .0002    1\n  Cat    .0003    2\n  Cat    .0002    2"
dict1 = {}
for line in K.split("\n"):
    sp = line.split()
    name = sp[0]
    unid = "_".join([sp[0] , sp[2][-2:]])
    num = float(sp[1])
    if not dict1.has_key(unid):
        dict1[unid] = [num,]
    else :
        dict1[unid].append(num)
print(dict1)
dictTot = sum([sum(x) for x in dict1.values()])
print(dictTot)

最終的な口述は

{'Dog_2': [0.0001], 
 'Dog_1': [0.0001, 3e-05], 
 'Cat_1': [0.0004, 0.0002], 
 'Cat_2': [0.0003, 0.0002]}

合計は

0.00133

値はリストなので、それらをループして個別に合計します。

編集

明らかに、「Cat_1: .0006、Cat_2: .0005 など」dict1が必要なようです。

for key in dict1.iterkeys():
    dict1[key] = sum(dict1[key])

dict1はなる

{'Dog_2': 0.0001, 
 'Dog_1': 0.00013, 
 'Cat_1': 0.0006, 
 'Cat_2': 0.0005}
于 2012-06-29T20:04:29.327 に答える
1

すべての値を合計するには、最初にすべてのリストを結合して、sum()処理可能な 1 つの iterable にする必要があります。これを行うには、次の 2 つの方法があります。

dictTot = sum(sum(dict1.values(), []))

そして、少し冗長ですが、より読みやすくなります:

from itertools import chain
dictTot = sum(chain.from_iterable(dict1.values()))

sum()実際には 2 つの引数を取ります。2 番目の引数のstartデフォルトは0です。intしたがって、への追加に関するエラー メッセージが表示されますlist。本質的に、それはこれをやっています: 0 + [1, 2, 3] + [1, 2].... 最初の例では、デフォルトの開始値を空のリストに設定しました。結果は単一のリストです。すべての値を 1 つのリストにまとめsum()たので、結果から答えを得ることができます。

編集

あなたの更新に応じて:

ジェネレータ式でこれを行うことができます:

dictTot = {key: sum(value) for key, value in dictTot.items()}

または < Python 2.7 を使用している場合:

dictTot = dict((key, sum(value)) for key, value in dictTot.iteritems())
于 2012-06-29T20:12:28.790 に答える
0

答え:

dict((k,sum(v)) for k,v in dict1.iteritems())

はい、変更しint(Decimal('.0001'))て defaultdict を使用します

反対票を含む質問の+1と、ワンライナーの回答を逃した4つの回答

EDITおっと、@ Joel Cornettが持っていたのを見逃したので、そこにも小道具があります

于 2012-06-29T20:59:06.287 に答える
0

これは機能します:

d={}
for line in K:
   sp = line.strip().split()
   unid = sp[0]+"_"+sp[-1] 
   num = decimal.Decimal(sp[1])
   d.setdefault(unid,[]).append(num)      

print({k:sum(v) for k, v in d.items()})

版画:

{'Dog_1': Decimal('0.00013'), 
 'Cat_2': Decimal('0.0005'), 
 'Cat_1': Decimal('0.0006'), 
 'Dog_2': Decimal('0.0001')}
于 2012-06-29T21:31:40.670 に答える