7

string が与えられた場合、stringsの各文字が何回出現するかを知りたいです。コードは次のとおりです。

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が初めてなので、マップの要素を反復処理する他の方法はわかりません. 誰かがこれを行う方法を教えてもらえますか? 前もって感謝します。

4

4 に答える 4

13

Counter を試すことができます (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キー/値のペアを反復できる辞書として動作します):

>>> for k, v in Counter('abbba').iteritems():
...   print k, v
...
a 2
b 3

2.7 より前のバージョンの Python を使用している場合はdefaultdict、コードを少し簡略化するために a を使用できます (プロセスは同じです。唯一の違いは、最初にキーをチェックする必要がないことです。'一致するキーが見つからない場合はデフォルトで 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})

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

>>> 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
于 2012-10-27T08:55:46.027 に答える
8

マッピングを反復すると、キーが生成されます。

>>> d = {'foo': 42, 'bar': 'quux'}
>>> for k in d:
...   print k, d[k]
... 
foo 42
bar quux
于 2012-10-27T08:56:47.320 に答える
2

dict() のヘルプを調べる必要があります。「for k in mp」はキーを繰り返し、「for v in mp.values()」は値を繰り返し、「for k,v in mp.items()」はキーと値のペアを繰り返します。

また、これらのセミコロンは必要ありません。これらは Python では合法ですが、誰も使用していません。使用する理由はほとんどありません。

于 2012-10-27T08:59:34.293 に答える
1

Python 2.5 以降

  dDIct = collections.defaultdict(int)
  [(d[i]+=1) for i in line]
  print dDict
于 2012-10-27T09:12:42.273 に答える