前言:

import collections
print([name for name in dir(collections) if not name.startswith("_")])
['AsyncIterable', 'AsyncIterator', 'Awaitable', 'ByteString', 'Callable', 'ChainMap', 'Container', 'Coroutine',
'Counter', 'Generator', 'Hashable', 'ItemsView', 'Iterable', 'Iterator', 'KeysView', 'Mapping', 'MappingView',
'MutableMapping', 'MutableSequence', 'MutableSet', 'OrderedDict', 'Sequence', 'Set', 'Sized', 'UserDict', 'UserList',
'UserString', 'ValuesView', 'abc', 'defaultdict', 'deque', 'namedtuple']

常用:

a)Counter: 计数器,用于统计元素的数量

b)OrderDict:有序字典

c)defaultdict:值带有默认类型的字典

d)namedtuple:可命名元组,通过名字来访问元组元素

e)deque :双向队列,队列头尾都可以放,也都可以取(与单向队列对比,单向队列只能一头放,另一头取)

1.from collections import namedtuple

from collections import namedtuple

# 定义一个namedtuple类型User,并包含name,sex和age属性。
User = namedtuple('User', ['name', 'sex', 'age']) 也可以不用列表使用空格间隔的str也可以
User = namedtuple('User', 'name sex age')
# 创建一个User对象 user = User(name='wqb', sex='male', age=24) # 也可以通过一个list来创建一个User对象,这里注意需要使用"_make"方法 user = User._make(['wqb', 'male', 24]) print(user) # User(name='wqb', sex='male', age=24) # 获取用户的属性 print(user.name) print(user.sex) print(user.age) # 修改对象属性,注意要使用"_replace"方法 user = user._replace(age=22) print(user) # User(name='wqb', sex='male', age=22) # 将User对象转换成字典,注意要使用"_asdict" print(user._asdict()) # OrderedDict([('name', 'wqb'), ('sex', 'male'), ('age', 22)])

适用地方:

学生信息系统:

(名字,年龄,性别,邮箱地址)为了减少存储开支,每个学生的信息都以一个元组形式存放

如:

('tom', 18,'male','tom@qq.com' )

('jom', 18,'mal','jom@qq.com' ) .......

这种方式存放,如何访问呢?

#!/usr/bin/python3

student = ('tom', 18, 'male', 'tom @ qq.com' )
print(student[0])
if student[1] > 12:
...
if student[2] == 'male':
...

出现问题,程序中存在大量的数字index,可阅读性太差,无法知道每个数字代替的含义=》

如何解决这个问题?

方法1:

#!/usr/bin/python3

# 给数字带上含义,和元组中一一对应
name, age, sex, email = 0, 1, 2, 3
# 高级:name, age, sex, email = range(4)
student = ('tom', 18, 'male', 'tom @ qq.com' )
print(student[name])
if student[age] > 12:
print('True')
if student[sex] == 'male':
print('True')

方法2:

  通过 collections库的 nametuple模块

rom collections import namedtuple

# 生成一个Student类
Student = namedtuple('Student', ['name', 'age', 'sex', 'email']) s = Student('tom', 18, 'male', 'tom@qq.com') print(s.name, s.age, s.sex, s.email)

 2.from collections import counter

用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。

创建:

# 创建一个空的Counter类
c0=Counter() # 从一个可iterable对象(list、tuple、dict、字符串等)创建
cs=Counter("axcvcx")
cl=Counter([1,2,3,4])
cm=Counter({'a':2,'c':3,'d':5}) # 从一组键值对创建
ceq=Counter(a=2,b=3,c=6)

Counter()
Counter({'x': 2, 'c': 2, 'v': 1, 'a': 1})
Counter({1: 1, 2: 1, 3: 1, 4: 1})
Counter({'d': 5, 'c': 3, 'a': 2})
Counter({'c': 6, 'b': 3, 'a': 2})

用键访问计数值

当键不存在的时候,不会报错而是返回0

>>> c = Counter("abcdefgab")
>>> c["a"]
2
>>> c["c"]
1
>>> c["h"]
0

计数器更新

增加和减法(update,substract)==>参数可以是iterable对象也可是Counter对象==>没有返回值,修改的是本身

c=Counter("asdfgg")
c2=Counter("aaa")
c.update(c2)
print(c)
# Counter({'a': 4, 'd': 1, 'f': 1, 'g': 2, 's': 1})
c.update("ssss")
print(c)
# Counter({'s': 5, 'a': 4, 'g': 2, 'd': 1, 'f': 1})
c=Counter("asdfgg")
c2=Counter("aaa")
c.subtract(c2)
print(c)
# Counter({'g': 2, 'f': 1, 'd': 1, 's': 1, 'a': -2})
c.subtract("ssss")
print(c)
# Counter({'g': 2, 'f': 1, 'd': 1, 'a': -2, 's': -3})

键的删除和修改

当值为零的时候并不意味着值被删除,要删除‘键值对’用 del

c=Counter("asdfgg")
c.subtract("s")
print(c)
# Counter({'g': 2, 'f': 1, 'd': 1, 'a': 1, 's': 0})
del c["a"]
print(c)
# Counter({'g': 2, 'f': 1, 'd': 1, 's': 0})

elements()

返回一个迭代器<class 'itertools.chain'>。元素被重复了多少次,在该迭代器中就包含多少个该元素。元素排列无确定顺序,个数小于1的元素不被包含。

c=Counter({"a":1,"b":2,"c":-1,"d":0,"e":5})
print(type(c.elements()),c.elements(),list(c.elements()))
# <class 'itertools.chain'>
# <itertools.chain object at 0x0000020D9A71D5F8>
# ['e', 'e', 'e', 'e', 'e', 'a', 'b', 'b']

most_common(n)

返回一个TopN列表。------>说明是排好顺序的(有序)。如果n没有被指定,则返回所有元素。当多个元素计数值相同时,优先返回key键Hash靠前的。

def most_common(self, n=None):
'''List the n most common elements and their counts from the most
common to the least. If n is None, then list all element counts.
>>> Counter('abcdeabcdabcaba').most_common(3)
[('a', 5), ('b', 4), ('c', 3)]
'''
# Emulate Bag.sortedByCount from Smalltalk
if n is None:
return sorted(self.items(), key=_itemgetter(1), reverse=True)
return _heapq.nlargest(n, self.items(), key=_itemgetter(1))
c=Counter({"a":1,"b":2,"c":-1,"d":1,"e":5})
print(c.most_common())
# [('e', 5), ('b', 2), ('a', 1), ('d', 1), ('c', -1)]
print(c.most_common(3))
# [('e', 5), ('b', 2), ('a', 1)]

浅拷贝copy

c=Counter({"a":1,"b":2,"c":-1,"d":1,"e":5})
c2=c.copy()
print(c2)
# Counter({'e': 5, 'b': 2, 'd': 1, 'a': 1, 'c': -1})
c.update("aaa")
print(c2)
# Counter({'e': 5, 'b': 2, 'd': 1, 'a': 1, 'c': -1})

算数和集合操作

+、-、&、|操作也可以用于Counter。其中&和|操作分别返回两个Counter对象各元素的最小值和最大值。需要注意的是,得到的Counter对象将删除小于1的元素。

c1=Counter({"a":1,"b":2,"c":-1,"d":1,"e":5})
c2=Counter(a=2,b=3)
#值小于0的数结果不显示
c1+c2 # 加
# Counter({'a': 3, 'b': 5, 'd': 1, 'e': 5})
c2-c1 #减
# Counter({'a': 1, 'b': 1, 'c': 1})
c1=Counter({"a":1,"b":2,"c":-1,"d":1,"e":5})
c2=Counter(a=2,b=3)
## 交集: 保留相同key键的并保留min(c[x], d[x])值
c1&c2
# Counter({'a': 1, 'b': 2}) ## 并集: 保留所有key键的并保留max(c[x], d[x])值
c1|c2
Counter({'a': 2, 'b': 3, 'd': 1, 'e': 5}) #也只保留计数为正数的元素

其他操作

sum(c.values())  # 所有计数的总数
c.clear() # 重置Counter对象,注意不是删除
list(c) # 将c中的键转为列表=》由tuple构成的list
set(c) # 将c中的键转为set
dict(c) # 将c中的键值对转为字典
c.items() # 转为(elem, cnt)格式的列表
Counter(dict(list_of_pairs)) # 从(elem, cnt)格式的列表转换为Counter类对象
c.most_common()[:-n:-1] # 取出计数最少的n个元素
c += Counter() # 移除0和负值

python之collections模块(nametuple,Counter)的更多相关文章

  1. Python中Collections模块的Counter容器类使用教程

    1.collections模块 collections模块自Python 2.4版本开始被引入,包含了dict.set.list.tuple以外的一些特殊的容器类型,分别是: OrderedDict类 ...

  2. python:collections模块

    Counter类 介绍:A counter tool is provided to support convenient and rapid tallies 构造:class collections. ...

  3. Python标准库——collections模块的Counter类

    1.collections模块 collections模块自Python 2.4版本开始被引入,包含了dict.set.list.tuple以外的一些特殊的容器类型,分别是: OrderedDict类 ...

  4. python的Collections 模块

    Collections 模块 知识点 Counter 类 defaultdict 类 namedtuple 类 在这个实验我们会学习 Collections 模块.这个模块实现了一些很好的数据结构,它 ...

  5. Python中collections模块

    目录 Python中collections模块 Counter defaultdict OrderedDict namedtuple deque ChainMap Python中collections ...

  6. python之collections模块(OrderDict,defaultdict)

    前言: import collections print([name for name in dir(collections) if not name.startswith("_" ...

  7. 转载:Python中collections模块

    转载自:Python中collections模块 目录 Python中collections模块 Counter defaultdict OrderedDict namedtuple deque Ch ...

  8. Python的collections模块中namedtuple结构使用示例

      namedtuple顾名思义,就是名字+元组的数据结构,下面就来看一下Python的collections模块中namedtuple结构使用示例 namedtuple 就是命名的 tuple,比较 ...

  9. Python中collections模块的使用

    本文将详细讲解collections模块中的所有类,和每个类中的方法,从源码和性能的角度剖析. 一个模块主要用来干嘛,有哪些类可以使用,看__init__.py就知道 '''This module i ...

  10. python 之 Collections模块

    官方文档:https://yiyibooks.cn/xx/python_352/library/collections.html 参考: https://blog.csdn.net/songfreem ...

随机推荐

  1. macos 更改罗技k810无线键盘的映射

    在mac系统中,command键非常关键,但k810接入后, win键被映射为Command,而Alt的位置却是mac内置键盘的Command的位置. 为方便使用,可以把Win键和Alt键做一个对换. ...

  2. 正确理解使用Vue里的nextTick方法

    最近,在项目中要使用Swiper做一个移动端轮播插件.需要先异步动态加载数据后,然后使用v-for渲染节点,再执行插件的滑动轮播行为.解决这个问题,我们通过在组件中使用vm.$nextTick来解决这 ...

  3. [转帖]POWER ISA开源 浪潮商用机器加速POWER技术生态建设步伐

    POWER ISA开源 浪潮商用机器加速POWER技术生态建设步伐 [原创]   2019-08-26 18:51:04 关键字: 开源 Power 浪潮商用机器 http://server.zhid ...

  4. 【AtCoder】diverta 2019 Programming Contest

    diverta 2019 Programming Contest 因为评测机的缘故--它unrated了.. A - Consecutive Integers #include <bits/st ...

  5. 高深的dp POJ 2229Sumsets

    对于这个问题, 我们显然可以看出来, 当他是奇数的时候, 直接等于他的前一个偶数 dp [ i ] = dp [ i - 1] ; 那么问题, 当它是偶数的时候, 我们应该怎么进行 dp 记忆化搜索并 ...

  6. 内存溢出,内存泄漏,CPU溢出区别

    内存溢出 out of memory,就是你要的内存空间超过了系统实际分配给你的空间,此时系统相当于没法满足你的需求,就会报内存溢出的错误 内存泄漏是指你向系统申请分配内存进行使用(new),可是使用 ...

  7. 【Python基础】14_Python中的TODO注释

    # TODO XXX... IDE中右键左下角,可显示当前项目所有的TODO

  8. 第9章:Python自动化管理

    1.使用SSH协议访问远程服务器 SSH协议 OpenSSH协议 使用密钥登陆远程服务器 使用ssh-agent管理私钥 2.使用Polysh批量管理服务器 Polysh requires pytho ...

  9. Ubuntu18.04安装MySQL与默认编码设置

    安装 打开终端直接开始,编码配置方法在后面 #通过apt更新包索引 sudo apt update #按照默认软件包安装 sudo apt install mysql-server #运行安全脚本 s ...

  10. js之数据类型(对象类型——构造器对象——正则)

    正则(regular expression)描述了一种字符串的匹配式.一般应用在一些方法中,用一些特殊的符号去代表一些特定的内容,对字符串中的信息实现查找,替换,和提取的操作.js中的正则表达式用Re ...