(Python第九天)Collections模块

一、Counter

collections是Python内建的一个集合模块,提供了许多有用的集合类

其中有很多类,Counter是一个有助于hashable对象计数的dict子类,它是一个无序的集合,其中hashable对象的元素存储为字典的键,它们的计数存储为字典的值,计数可以为任意整数,包括零和负数

实例:查看Python的LICENSE文件中某些单词出现的次数

>>> from collections import Counter
>>> import re
>>> path = '/usr/lib/python3.5/LICENSE.txt'
>>> words = re.findall('\w+', open(path).read().lower())
>>> Counter(words).most_common(10)
[('the', 80), ('or', 78), ('1', 66), ('of', 61), ('to', 50), ('and', 48), ('python', 46), ('in', 38), ('license', 37), ('any', 37)]

ps:1)re findall返回能匹配的字符串

re.findall(pattern,string,flags=0)  

findall()可以遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表

pattern 正则表达式

string 搜索的是字符串

flags是匹配的模式,其中re.s使匹配包括换行在内的所有字符,findall()函数是逐行匹配的

浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串放到一个列表中,未能匹配成功返回空列表,一旦匹配成功,再次匹配从前一次匹配成功的后面一位开始的

#!/usr/bin/env python
# -*- coding:utf8 -*-
import re
#无分组
r = re.findall("\d+\w\d+", "a2b3c4d5")    #浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串放到一个列表中
print(r)
#输出结果
#['2b3', '4d5']
#注意:匹配成功的字符串,不在参与下次匹配,所以3c4也符合规则但是没匹配到

 

p = re.compile(r'\d+')
print(p.findall('o1n2m3k4'))
执行结果如下:
['1', '2', '3', '4']

  

import re
tt = "Tina is a good girl, she is cool, clever, and so on..."
rr = re.compile(r'\w*oo\w*')
print(rr.findall(tt))               #查找所有包含‘oo’的单词
print(re.findall(r'(\w)*oo(\w)',tt))#()表示子表达式 
执行结果如下:
['good', 'cool']
[('g', 'd'), ('c', 'l')]  

①反斜杠后边跟普通字符集和组里都是有用的

/d匹配任何十进制数,相当于类【0-9】

/w匹配包括下划线在内任何字母数字字符,相当于类【a-zA-Z0-9】

②()元字符,分组

即分组匹配,()里面的为一个整体,如果()后面跟的是特殊元字符如(abc)*那么*控制的前导字符就是()里的整体内容,不再是前导一个字符

#!/usr/bin/env python
# -*- coding:utf8 -*-
import re   #第一步,要引入re模块
#也就是分组匹配,()里面的为一个组也可以理解成一个整体
a = re.search("(a4)+", "a4a4a4a4a4dg4g654gb")   #匹配一个或多个a4
b = a.group()
print(b)
#打印出 a4a4a4a4a4  

如果没有写匹配规则,返回的是一个比原始字符串多一位的空字符串

#!/usr/bin/env python
# -*- coding:utf8 -*-
import re
#无分组
r = re.findall("", "a2b3c4d5")    #浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串放到一个列表中
print(r)
#输出结果
#['', '', '', '', '', '', '', '', '']
#注意:如果没写匹配规则,也就是空规则,返回的是一个比原始字符串多一位的,空字符串列表

 关于re模块,主要看:https://www.cnblogs.com/zjltt/p/6955965.html

2)

lower()方法是把所有的字符都换成小写

Counter对象有一个叫做element()方法,其返回的序列中,依照计数重复元素相同次数,元素顺序是无序的

>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> list(c.elements())
['b','b','a', 'a', 'a', 'a']

  

most_common()方法返回最常见的元素及其计数,顺序为最常见到最少

二、defaultdict

defaultdict是内建dict类的子类,它覆写了一个方法并添加了一个可写的实例变量,其余功能与字典相同

defaultdict()第一个参数提供了default_factory属性的初始值,默认值为None, default_factory属性值将作为字典的默认数据类型,所有剩余的参数与字典的构造方法相同,包括关键字参数

>>> from collections import defaultdict
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
...     d[k].append(v)
...
>>> d.items()
dict_items([('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])])

  

三、namedtuple命名元组

>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])  # 定义命名元组
>>> p = Point(10, y=20)  # 创建一个对象
>>> p
Point(x=10, y=20)
>>> p.x + p.y
30
>>> p[0] + p[1]  # 像普通元组那样访问元素
30
>>> x, y = p     # 元组拆封
>>> x
10
>>> y
20

  

posted @ 2019-01-25 00:22  ywangji  阅读(177)  评论(0编辑  收藏  举报