2017-10-29 10 views
1

私は、次の辞書、キーというタプルている:私は私が得ることができるように、最初のキー要素と第2の重要な要素、 をdefaultdict(python)のタプル内のユニークなキー要素を数える方法は?

defaultdict(<class 'float'>, {('abc', 'xyz'): 1.0, ('abc', 'def'): 
3.0, ('abc', 'pqr'): 1.0, ('pqr', 'xyz'): 1.0, ('pqr', 'def'): 1.0}) 

をカウントアップするにはどうすればよい:

defaultdict(<class 'float'>, {'abc': 3.0, 'pqr': 3.0}) 

defaultdict(<class 'float'>, {'xyz': 2.0, 'def': 2.0, 'pqr': 1.0}) 

私は元の辞書の値を無視しており、一意のキーを数えています(最初と2番目は別々です)。

「『タプル』オブジェクトが属性 『アイテム』を持っていない」私は、次のような何かをしたいが、私はエラーを取得:

first_key_list =[j[0][0] for i in dictionary for j in i.items()] 
new_dict = collections.defaultdict(float) 
for i in first_key_list: 
    new_dict[i] += 1 
+0

私はあなたの計算を理解していません:あなたは値を無視していますか? 1 + 3 + 1であるため、abc => 5.0ではありませんか? –

+0

はい私は値を無視して、最初のキー要素と2番目のキー要素としてabcが何回出てくるかを数えています。 – ru111

答えて

1

for i in dictionary for j in i.items()外側のループが辞書のキー(タプル)が得られるので、動作しない、とitemstuplesには適用されません。

とにかく、あなたの辞書の値を無視しているようです。ただ、キーの最初の部分にcollections.Counterを使用します。

d = {('abc', 'xyz'): 1.0, ('abc', 'def'): 
3.0, ('abc', 'pqr'): 1.0, ('pqr', 'xyz'): 1.0, ('pqr', 'def'): 1.0} 

import collections 

d1 = collections.Counter(k[0] for k in d) 

print(d1) 

結果:

Counter({'abc': 3, 'pqr': 2}) 

あなたが山車をしたい場合、私はあなたがが浮動小数点の不正確さを避けるために数えた後をfloat型に変換することを示唆しています:

{k:float(v) for k,v in d1.items()} 

または1行で:

d1 = {k:float(v) for k,v in collections.Counter(k[0] for k in d).items()} 

タプルとしてキーを保つために:

d1 = {(k,):float(v) for k,v in collections.Counter(k[0] for k in d).items()} 

第二部のために、だけではなく、k[1]を使用しています。

+0

浮動小数点数の辞書を取得するにはどうすればよいですか? – ru111

+0

私の編集を参照してください。後で変換してください –

+0

最終的な辞書キーをタプルに変換する簡単な方法はありますか?例えば私の編集を参照してください、むしろ単純です。デフォルトのディクテーション(、{( 'abc'、):3.0、( 'pqr'、)}) – ru111

2

あなたはあなたのアプローチには正しい軌道に乗っています。しかし、あなたが物を数えたい場合はCounterオブジェクトを使うことをお勧めします。反復は、デフォルトでは、キーの上にあるので、

from collections import Counter 

c1 = Counter(k[0] for k in d.keys()) 
c2 = Counter(k[1] for k in d.keys()) 

正直、d.keys()は、ここでは冗長です。


c1 
Counter({'abc': 3, 'pqr': 2}) 

c2 
Counter({'def': 2, 'pqr': 1, 'xyz': 2}) 
+0

ありがとう!浮動小数点値を使用して、どうすれば辞書を取得できますか? – ru111

+0

@ ru111浮動小数点数が必要な場合は、次のようにする必要があります: 'c1 = {k:float(v)for k、c1.items()}' –

+0

@ ru111また、上記の私のコメントを参照してください)、私はそうすることをお勧めしたいと思います。 –

関連する問題