《Python Cookbook(第3版)中文版》——1.12 找出序列中出现次数最多的元素

1.12 找出序列中出现次数最多的元素

1.12.1 问题

我们有一个元素序列,想知道在序列中出现次数最多的元素是什么。

1.12.2 解决方案

collections模块中的Counter类正是为此类问题所设计的。它甚至有一个非常方便的most_common()方法可以直接告诉我们答案。

为了说明用法,假设有一个列表,列表中是一系列的单词,我们想找出哪些单词出现的最为频繁。下面是我们的做法:

words = [
   'look', 'into', 'my', 'eyes', 'look', 'into', 'my', 'eyes',
   'the', 'eyes', 'the', 'eyes', 'the', 'eyes', 'not', 'around', 'the',
   'eyes', "don't", 'look', 'around', 'the', 'eyes', 'look', 'into',
   'my', 'eyes', "you're", 'under'
]

from collections import Counter
word_counts = Counter(words)
top_three = word_counts.most_common(3)
print(top_three)
# Outputs [('eyes', 8), ('the', 5), ('look', 4)]

1.12.3 讨论

可以给Counter对象提供任何可哈希的对象序列作为输入。在底层实现中,Counter是一个字典,在元素和它们出现的次数间做了映射。例如:

>>> word_counts['not']
1
>>> word_counts['eyes']
8
>>>

如果想手动增加计数,只需简单地自增即可:

>>> morewords = ['why','are','you','not','looking','in','my','eyes']
>>> for word in morewords:
... word_counts[word] += 1
...
>>> word_counts['eyes']
9
>>>

另一种方式是使用update()方法。

>>> word_counts.update(morewords)
>>>

关于Counter对象有一个不为人知的特性,那就是它们可以轻松地同各种数学运算操作结合起来使用。例如:

>>> a = Counter(words)
>>> b = Counter(morewords)
>>> a
Counter({'eyes': 8, 'the': 5, 'look': 4, 'into': 3, 'my': 3, 'around': 2,
         "you're": 1, "don't": 1, 'under': 1, 'not': 1})
>>> b
Counter({'eyes': 1, 'looking': 1, 'are': 1, 'in': 1, 'not': 1, 'you': 1,
         'my': 1, 'why': 1})

>>> # Combine counts
>>> c = a + b
>>> c
Counter({'eyes': 9, 'the': 5, 'look': 4, 'my': 4, 'into': 3, 'not': 2,
         'around': 2, "you're": 1, "don't": 1, 'in': 1, 'why': 1,
         'looking': 1, 'are': 1, 'under': 1, 'you': 1})

>>> # Subtract counts
>>> d = a - b
>>> d
Counter({'eyes': 7, 'the': 5, 'look': 4, 'into': 3, 'my': 2, 'around': 2,
         "you're": 1, "don't": 1, 'under': 1})
>>>

不用说,当面对任何需要对数据制表或计数的问题时,Counter对象都是你手边的得力工具。比起利用字典自己手写算法,更应该采用这种方式完成任务。

时间: 2024-10-28 10:28:05

《Python Cookbook(第3版)中文版》——1.12 找出序列中出现次数最多的元素的相关文章

找出字符串中出现次数最多的字母和出现次数精简版_javascript技巧

复制代码 代码如下: <script type="text/javascript"> var a = "testthisprojecthelloworld!"; var b = {}; var c = null; for (var i in a) { !isNaN(b[a[i]]++) || (b[a[i]] = 1); c = b[a[i]] > c ? a[i] : c; } alert(c + ":" + b[c]); &

python实现获取序列中最小的几个元素_python

本文实例讲述了python实现获取序列中最小的几个元素.分享给大家供大家参考. 具体方法如下: import heapq import random def issorted(data): data = list(data) heapq.heapify(data) while data: yield heapq.heappop(data) alist = [x for x in range(10)] random.shuffle(alist) print 'the origin list is'

Python提取新浪公共微博中转载次数最多的微博转载数,用户名,内容

CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''''' Created on 2014-7-4 @author: guaguastd @name: find_popular_retweets.py ''' if __name__ == '__main__': #import json # get weibo_api to access sina api from sinaWeiboLogin import sinaWeiboLogin sina

《Python Cookbook(第3版)中文版》——导读

前 言 自2008年以来,我们已经目睹了整个Python世界正缓慢向着Python 3进化的事实.众所周知,完全接纳Python 3要花很长的时间.事实上,就在写作本书时(2013年),大多数Python程序员仍然坚持在生产环境中使用Python 2.关于Python 3不能向后兼容的事实也已经做了许多努力来补救.的确,向后兼容性对于任何已经存在的代码库来说是个问题.但是,如果你着眼于未来,你会发现Python 3带来的好处绝非那么简单. 正因为Python 3是着眼于未来的,本书在之前的版本上

python实现从字符串中找出字符1的位置以及个数的方法_python

本文实例主要实现给出任意字符串,获取字符串中某字符的位置以及出现的总次数. 实现该功能代码的时候可以使用函数enumerate来将字符串分离成位置和字符,然后进行比较即可. 具体实现代码如下: #!/bin/env python #-*- coding:utf-8 -*- # """ 用enumerate将string中的1都找出来, 用enumerate实现: """ def get_1_pos(string): onePos=[] try:

《Python Cookbook(第2版)中文版》——1.18 一次完成多个替换

1.18 一次完成多个替换 任务 你想对字符串的某些子串进行替换. 解决方案 正则表达式虽然不易读懂,但有时它的确是最快的方法.re对象(标准库中的re模块)提供的强大sub方法,非常利于进行高效的正则表达式匹配替换.下面给出一个函数,该函数返回一个输入字符串的拷贝,该拷贝中的所有能够在指定字典中找到的子串都被替换为字典中的对应值: import re def multiple_replace(text, adict): rx = re.compile('|'.join(map(re.escap

《Python Cookbook(第2版)中文版》——1.20 使用Unicode来处理国际化文本

1.20 使用Unicode来处理国际化文本 任务 需要处理包含了非ASCII字符的文本字符串. 解决方案 可以在一些使用普通的字节串str类型的场合,使用Python提供的内置的unicode类型.用法很简单,只要接受了在字节串和unicode字符串之间的显式转换的方式: >>> german_ae = unicode('\xc3\xa4', 'utf8') 这里german_ae是一个unicode字符串,代表了小写的德语元音变音(umlaut,或其他分音符)字符"æ&qu

《Python Cookbook(第2版)中文版》——1.19 检查字符串中的结束标记

1.19 检查字符串中的结束标记 任务 给定一个字符串s,你想检查s中是否含有多个结束标记中的一个.需要一种快捷.优雅的方式,来替换掉s.endswith(end1).s.endswith(end2)或s.endswith(end3)之类的笨重用法. 解决方案 对于类似于本节的问题,itertools.imap给出了一种快速方便的解决办法: import itertools def anyTrue(predicate, sequence): return True in itertools.im

《Python Cookbook(第2版)中文版》——1.6 合并字符串

1.6 合并字符串 任务 有一些小的字符串,想把这些字符串合并成一个大字符串. 解决方案 要把一系列小字符串连接成一个大字符串,可以使用字符串操作符join.假如pieces是一个字符串列表,想把列表中所有的字符串按顺序拼接成一个大字符串,可以这么做: largeString = ''.join(pieces) 如果想把存储在一些变量中的字符串片段拼接起来,那么使用字符串格式化操作符%会更好一些: largeString = '%s%s something %s yet more' % (sma