2012-10-27 23 views
5

文字列sが与えられた場合、文字列の各文字が何回出現するか知りたいと思います。Pythonでマップの要素を反復する方法

def main() : 
    while True : 
    try : 
     line=raw_input('Enter a string: ') 
    except EOFError : 
     break; 
    mp={}; 

    for i in range(len(line)) : 
     if line[i] in mp : 
     mp[line[i]] += 1; 
     else : 
     mp[line[i]] = 1; 

    for i in range(len(line)) : 
     print line[i],': ',mp[line[i]]; 

if __name__ == '__main__' : 
    main(); 

私はこのコードを実行すると、私はabbbaを入力すると、私が手::

a : 2 
b : 3 
b : 3 
b : 3 
a : 2 

私だけを取得したいと思います:

a : 2 
b : 3 

なぜこの私が理解ここでは、コードです私はPythonを初めて使っているので、マップの要素を繰り返し処理する方法はわかりません。誰も私にこのことを教えてもらえますか?前もって感謝します。

答えて

12

あなたはカウンター(Pythonの2.7以上、事前2.7オプションについては下記参照)を試みることができる:

>>> from collections import Counter 
>>> Counter('abbba') 
Counter({'b': 3, 'a': 2}) 

あなたはその後、ちょうど辞書のよう要素にアクセスすることができます。

>>> counts = Counter('abbba') 
>>> counts['a'] 
2 
>>> counts['b'] 
3 

そして反復するために、@ BurhanKhalidの提案を使用することができます(Counterは辞書として動作し、キー/値のペアを繰り返し処理できます)。

2.7より前のバージョンのPythonを使用している場合は、defaultdictを使用してコードを単純化することができます(プロセスは変わりませんが、最初はキーを確認する必要はありません一致するキーが見つからない場合は、デフォルトで0になります)。 Counterには他の機能が組み込まれていますが、単純にカウントが必要な場合(たとえばmost_common、またはsubtractには関わらず)、これは他の辞書と同じように扱うことができます。

>>> from collections import defaultdict 
>>> counts = defaultdict(int) 
>>> for c in 'abbba': 
... counts[c] += 1 
... 
>>> counts 
defaultdict(<type 'int'>, {'a': 2, 'b': 3}) 

あなたは辞書(またはここCounter/defaultdict)にiteritems()を使用する場合は、キーと値が各反復のために返される(この場合は、文字と出現数である値であるキー)。辞書を使用する際の注意点の1つは、それらが本質的に順序付けられていないことです。したがって、反復処理中に必ず'a', 'b', ...を取得する必要はありません。ソートされた方法で辞書を反復する基本的な方法の1つは、ソートされたキーのリスト(ここではアルファベットですが、sortedはさまざまなオプションを扱うために操作できます)を反復し、そのキーの辞書値を返します)他の方法ですが、これがうまくいけば、多少参考になります:mapping利回りキーの上に

>>> mapping = {'some': 2, 'example': 3, 'words': 5} 
>>> mapping 
{'some': 2, 'example': 3, 'words': 5} 
>>> for key in sorted(mapping.keys()): 
... print key, mapping[key] 
... 
example 3 
some 2 
words 5 
+0

正解ですが、カウンタの要素を反復する方法を教えてください。 –

+0

'for k、vのカウンター( 'aaaabbbcccddd')iteritems():' –

+0

@RondogiannisAristophanes確かに(Ignacioのポストは、最も単純な方法を示しています)。 – RocketDonkey

6

反復処理。

>>> d = {'foo': 42, 'bar': 'quux'} 
>>> for k in d: 
... print k, d[k] 
... 
foo 42 
bar quux 
+0

それは働いて、ありがとう。 –

+0

@RondogiannisAristophanes: 'collections.Counter'はマッピングであるため、同じ方法で1つを繰り返し処理できます。 – martineau

2

dict()のヘルプを参照する必要があります。それはすべてそこにあります - 'for mp in'はキーを反復します。 'はmp.values()の値が反復され、mp.items()はキーと値のペアを反復します。

また、セミコロンは不要です。彼らはPythonでは合法ですが、誰もそれらを使用しません。理由はほとんどありません。

1

Python 25以上

dDIct = collections.defaultdict(int) 
    [(d[i]+=1) for i in line] 
    print dDict 
+0

私はあなたが 'collections.defaultdict'を意味すると信じています:) – RocketDonkey

+0

@RocketDonkey:そうです、スマートフォンを使うと起こります;-) – Michael

+0

母、それは分かりません:) – RocketDonkey

関連する問題