如何在python中迭代地图的元素

Ron*_*nis 5 python string iteration map

给定一个字符串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();
Run Code Online (Sandbox Code Playgroud)

当我运行此代码并进入时abbba,我得到:

a : 2
b : 3
b : 3
b : 3
a : 2
Run Code Online (Sandbox Code Playgroud)

我想只得到:

a : 2
b : 3
Run Code Online (Sandbox Code Playgroud)

我理解为什么会发生这种情况,但由于我是python的新手,我不知道任何其他方法来迭代地图的元素.谁能告诉我怎么做?提前致谢.

Roc*_*key 12

您可以尝试一个Counter(Python 2.7及以上版本;请参阅下面的2.7之前的选项):

>>> from collections import Counter
>>> Counter('abbba')
Counter({'b': 3, 'a': 2})
Run Code Online (Sandbox Code Playgroud)

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

>>> counts = Counter('abbba')
>>> counts['a']
2
>>> counts['b']
3
Run Code Online (Sandbox Code Playgroud)

要迭代,你可以使用@ BurhanKhalid的建议(Counter表现为字典,你可以迭代键/值对):

>>> for k, v in Counter('abbba').iteritems():
...   print k, v
...
a 2
b 3
Run Code Online (Sandbox Code Playgroud)

如果您使用的是2.7之前版本的Python,您可以使用a 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})
Run Code Online (Sandbox Code Playgroud)

当您iteritems()在字典(或Counter/ defaultdicthere)上使用时,每次迭代都会返回一个键和一个值(在这种情况下,键是字母,值是出现次数).关于使用字典的一点要注意的是它们本身就是无序的,因此'a', 'b', ...在迭代时你不一定会得到它们.以排序方式迭代字典的一种基本方法是遍历排序的键列表(这里按字母顺序排列,但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
Run Code Online (Sandbox Code Playgroud)


Ign*_*ams 7

迭代映射会生成密钥.

>>> d = {'foo': 42, 'bar': 'quux'}
>>> for k in d:
...   print k, d[k]
... 
foo 42
bar quux
Run Code Online (Sandbox Code Playgroud)