0

だから私は辞書を持っています

d = {'a': [4,'Adam', 2, ‘Bob’, 3], 'b': [3,'John', 4, ‘Bill’], 'c': [4,'Adam', 3, 4, ‘John’], 'd': [4,'Bill', ‘Joe’, 3], 'e': [4,'Bob', ‘Bob’, 5, 8, 10], 'f': [4, 'Joe'], 'g': [4, 'Bill', 4, ‘Joe’, 1]}

次のような名前の数を返したい

Adam: 2
Bill: 3
John: 2
Bob: 3
Joe: 3

この関数を介してコレクションカウンターを使用してみました:

x = 0
for vals in d.itervalues(): 
    while x<len(vals):           
        if type(vals[x]) == str:
            print Counter([vals[x]])
        x = x+1 

どちらが返されますか

Counter({'Adam': 1})
Counter({'Bob': 1})
Counter({'Adam': 1})
Counter({'John': 1})
Counter({'John': 1})
Counter({'Bill': 1})
Counter({'Bob': 1})
Counter({'Bob': 1})
Counter({'Bill': 1})
Counter({'Joe': 1})
Counter({'Bill': 1})
Counter({'Joe': 1})
Counter({'Joe': 1})

しかし、それは私が望む結果ではありません。カウンターを追加するだけでよいでしょうか?どうすればいいですか?カウンター クラスに加算/減算機能があることはわかっていますが、試しているメソッドが機能していません。

また、バリエーションごとに異なるカウンターを出力するために、このようなことも試しました。

'c%s'%(x)

これにより、各カウンターに c1、c2、c3 が設定され、それらを c1 + c2 + c3 で追加するだけで、必要な結果が得られます。ただし、これらの異なるカウンター リストを印刷できません。

それに伴い、一度結果を返すと必ず「Counter({ _ _})」を返します。その部分を削除したり、名前だけを印刷して数えたりするにはどうすればよいですか?

助けてくれてありがとう!

4

1 に答える 1

6

Counterカウントするアイテムごとに新しいインスタンスを作成しています。ここでは、それらすべてをカウントするために単一のインスタンスが必要です。

from collections import Counter
counter = Counter(s for v in d.itervalues() for s in v if isinstance(s, str))

これにより、

Counter({'Bob': 3, 'Bill': 3, 'Joe': 3, 'John': 2, 'Adam': 2})

一般に、ディクショナリ値で発生する種類の異なるリストはできるだけ避ける必要があることに注意してください。

于 2012-08-02T15:52:44.963 に答える