2

私の辞書は次のようになります。

docScores = {0:[{u'word':2.3},{u'the':8.7},{u'if':4.1},{u'Car':1.7}],
             1:[{u'friend':1.2},{u'a':5.2},{u'you':3.8},{u'person':0.8}],
             ...
             29:[{u'yard':1.5},{u'gardening':2.8},{u'paint':3.7},{u'brush':1.6}]
            }

各リストの各内部辞書の値を合計し、それを新しい辞書に格納したいのですが、新しい辞書には次のキー値があり{0:2.3+8.7+4.1+1.7, 1:1.2+5.2+3.8+0.8, ... etc}ます

for x in docScores[0]: #{0:
    for x in docScores[0][0].values(): #{,2.3}.
        sum = sum+x #where sum = 0 before loop
        docSum[0] = sum
    repeat this loop for every document

私が試したバリエーションはすべて、予期しない出力をもたらします。誰でもこれの正しい構文を教えてもらえますか?

4

5 に答える 5

3

このdict理解は機能します:

docScores = {0:[{u'word':2.3},{u'the':8.7},{u'if':4.1},{u'Car':1.7}],
             1:[{u'friend':1.2},{u'a':5.2},{u'you':3.8},{u'person':0.8}],
             29:[{u'yard':1.5},{u'gardening':2.8},{u'paint':3.7},{u'brush':1.6}]
            }

sum_d={k:sum(d.values()[0] for d in v) for k,v in docScores.items()}

print sum_d

プリント:

{0: 16.8, 1: 11.0, 29: 9.6}

ただし、データ構造の変更は簡単な場合があります。あなたは口述の口述を持つことができます:

>>> NdocScores = {0:{u'word':2.3,u'the':8.7,u'if':4.1,u'Car':1.7},
...              1:{u'friend':1.2,u'a':5.2,u'you':3.8,u'person':0.8},
...              29:{u'yard':1.5,u'gardening':2.8,u'paint':3.7,u'brush':1.6}
...             }   

これにより、各ドキュメントデータに直接アクセスできます。

>>> NdocScores[0]
{u'Car': 1.7, u'the': 8.7, u'word': 2.3, u'if': 4.1}
>>> NdocScores[0][u'Car']
1.7
>>> sum(NdocScores[1].values())
11.0

>>> NdocScores[29]
{u'gardening': 2.8, u'yard': 1.5, u'brush': 1.6, u'paint': 3.7}

または、ドキュメントインデックスに対応するリスト内の位置を含むdictのリストを用意します。

>>> lofdicts=[v for k,v in NdocScores.items()]
>>> lofdicts
[{u'Car': 1.7, u'the': 8.7, u'word': 2.3, u'if': 4.1}, {u'a': 5.2, u'person': 0.8, u'you': 3.8, u'friend': 1.2}, {u'gardening': 2.8, u'yard': 1.5, u'brush': 1.6, u'paint': 3.7}]
>>> lofdicts[0]
{u'Car': 1.7, u'the': 8.7, u'word': 2.3, u'if': 4.1}
>>> sum(lofdicts[1].values())
11.0
于 2012-08-03T14:22:05.087 に答える
2
new_dict={}

docScores = {0:[{u'word':2.3},{u'the':8.7},{u'if':4.1},{u'Car':1.7}],
             1:[{u'friend':1.2},{u'a':5.2},{u'you':3.8},{u'person':0.8}],
             29:[{u'yard':1.5},{u'gardening':2.8},{u'paint':3.7},{u'brush':1.6}]
            }

for k,v in docScores.items():
    new_dict[k]=sum( sum(d.values()) for d in v )

print (new_dict) #{0: 16.8, 1: 11.0, 29: 9.6}

他の人が述べているように、これを辞書の理解(python 2.7+)にすることができます:

new_dict = {k : sum( sum(d.values()) for d in v ) for k,v in docScores.items() }

しかし、現時点では、理解が非常に難しくなっていると思います(したがって、私は理解しません)。

また、すべての辞書キーが0から29までの連続した整数である場合、このデータを格納するために辞書を使用するべきではないことを誰かが指摘する必要があります-おそらくリストがより適切でしょう...

編集

リストの使用:

new_list = [sum( sum(d.values()) for d in v ) for _,v in sorted(docScores.items()) ]
于 2012-08-03T14:14:50.173 に答える
1

そして、より多くのワンラインが解決します)

sum(reduce(lambda x, y: x+y, [d.values() for d in v for _,v in docScores.iteritems()]))
于 2012-08-03T14:20:36.957 に答える
1
>>> doc_scores = {
        0: [{u'word': 2.3}, {u'the': 8.7}, {u'if': 4.1}, {u'Car': 1.7}],
        1: [{u'friend': 1.2}, {u'a': 5.2}, {u'you': 3.8}, {u'person': 0.8}],
        29: [{u'yard': 1.5}, {u'gardening': 2.8}, {u'paint': 3.7}, {u'brush': 1.6}]
}
>>> dict((k, sum(n for d in v for n in d.itervalues())) 
         for k, v in doc_scores.iteritems())
{0: 16.8, 1: 11.0, 29: 9.6}

リスト内の各辞書に値が 1 つしかない場合は、これを短縮できます。

>>> dict((k, sum(d.values()[0] for d in v)) for k, v in doc_scores.iteritems())
{0: 16.8, 1: 11.0, 29: 9.6}
于 2012-08-03T14:17:02.073 に答える
0
docScores = {0:[{u'word':2.3},{u'the':8.7},{u'if':4.1},{u'Car':1.7}],
             1:[{u'friend':1.2},{u'a':5.2},{u'you':3.8},{u'person':0.8}],
             2:[{u'yard':1.5},{u'gardening':2.8},{u'paint':3.7},{u'brush':1.6}]
            }


result = dict(enumerate(sum (sum(word.values()) for word in  word_list[1]) for word_list in sorted(docScores.items())  ) ) 
于 2012-08-03T14:26:58.960 に答える