【问题标题】:How to iterate over the elements of a map in python如何在python中遍历地图的元素
【发布时间】:2012-10-17 09:51:02
【问题描述】:

给定一个字符串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 新手,我不知道任何其他方法来迭代地图的元素。谁能告诉我该怎么做?提前致谢。

【问题讨论】:

    标签: python string map iteration


    【解决方案1】:

    您可以尝试使用 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 来稍微简化您的代码(过程仍然相同 - 唯一的区别是现在您不必检查key first - 如果找不到匹配的密钥,它将“默认”为 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', ...。以排序方式遍历字典的一种基本方法是遍历键的排序列表(这里按字母顺序排列,但 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
    

    【讨论】:

    • 不错的答案,但你能告诉我如何迭代计数器的元素吗?
    • for k, v in Counter('aaaabbbcccddd').iteritems():
    • @RondogiannisAristophanes 当然可以(Ignacio 下面的帖子显示了最直接的方法)。
    • @BurhanKhalid's 也很可爱 :)
    • 我还是有同样的问题。
    【解决方案2】:

    Python 2.5 及更高版本

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

    【讨论】:

    • 我相信你的意思是collections.defaultdict :)
    • @RocketDonkey:是的,你说得对,它发生在你使用智能手机时;-)
    【解决方案3】:

    您需要查找 dict() 的帮助。一切都在那里——'for k in mp' 迭代键,'for v in mp.values()' 迭代值,'for k,v in mp.items()' 迭代键、值对。

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

    【讨论】:

      【解决方案4】:

      遍历 mapping 会产生键。

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

      【讨论】:

      • @RondogiannisAristophanes:由于collections.Counter 是一个映射,您可以以相同的方式迭代一个映射。
      猜你喜欢
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-10
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      相关资源
      最近更新 更多