如何在python中迭代映射的元素

如何在python中迭代映射的元素,python,string,map,iteration,Python,String,Map,Iteration,给定一个字符串s,我想知道该字符串中每个字符出现的次数。代码如下: 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; e

给定一个字符串
s
,我想知道该字符串中每个字符出现的次数。代码如下:

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新手,我不知道其他任何迭代映射元素的方法。谁能告诉我怎么做?提前谢谢

您可以尝试计数器(Python2.7及更高版本;有关2.7之前的选项,请参见下文):

然后,您可以像访问字典一样访问元素:

>>> counts = Counter('abbba')
>>> counts['a']
2
>>> counts['b']
3
>>> from collections import defaultdict
>>> counts = defaultdict(int)
>>> for c in 'abbba':
...   counts[c] += 1
...
>>> counts
defaultdict(<type 'int'>, {'a': 2, 'b': 3})
要进行迭代,您可以使用@BurhanKhalid的建议(计数器的行为就像一个字典,您可以在其中迭代键/值对):

如果您使用的是Python 2.7之前的版本,那么可以使用
defaultdict
稍微简化您的代码(过程仍然相同-唯一的区别是现在您不必首先检查密钥-如果找不到匹配的密钥,它将“默认”为0)<代码>计数器内置了其他功能,但如果您只是想要计数(并且不关心最常见的
或能够
减去
,例如),这应该很好,可以像其他任何字典一样处理:

>>> counts = Counter('abbba')
>>> counts['a']
2
>>> counts['b']
3
>>> from collections import defaultdict
>>> counts = defaultdict(int)
>>> for c in 'abbba':
...   counts[c] += 1
...
>>> counts
defaultdict(<type 'int'>, {'a': 2, 'b': 3})
在一个数组上迭代会产生关键点

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

您需要查找dict()的帮助。它们都在那里--“对于mp中的k”迭代键,“对于mp.values()中的v”迭代值,“对于mp.items()中的k,v”迭代键和值对

此外,您不需要这些分号。虽然它们在Python中是合法的,但没有人使用它们,几乎没有理由这样做。

Python2.5及更高版本

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

回答很好,但是你能告诉我如何迭代计数器的元素吗?
对于计数器中的k,v('aaaabbbcccddd')。iteritems():
@RondogiannisAristophanes肯定的事情(Ignacio下面的帖子展示了最直接的方法)@BurhanKhalid's也很可爱:)我仍然有同样的问题。我相信你指的是
收藏。defaultdict
:)@RocketDonkey:是的,你是对的,当你使用智能手机时就会发生;-)@RondogiannisAristophanes:Since
collections.Counter
是一个映射,您可以用同样的方法对其进行迭代。
  dDIct = collections.defaultdict(int)
  [(d[i]+=1) for i in line]
  print dDict