好久没学习了,简单了解下

Ⅰ、namedtuple

1.1 简单回顾一下tuple

tuple是一个不可变的可迭代对象

  1. ①可迭代
  2. In [1]: test_tuple = (1,2,3,4,5)
  3. In [2]: for i in test_tuple:
  4. ...: print(i)
  5. ...:
  6. 1
  7. 2
  8. 3
  9. 4
  10. 5
  11. ②不可变
  12. In [3]: test_tuple[0] = 5
  13. ---------------------------------------------------------------------------
  14. TypeError Traceback (most recent call last)
  15. <ipython-input-3-8e5f1b05e43e> in <module>()
  16. ----> 1 test_tuple[0] = 5
  17. TypeError: 'tuple' object does not support item assignment
  18. 不可变指的是其中的元素不可变
  19. In [4]: test_tuple = (6,7,8)
  20. 其元素不可变也不是绝对的
  21. In [5]: test_tuple = (1,[2,3])
  22. In [6]: test_tuple[1].append(4)
  23. In [7]: print(test_tuple)
  24. (1, [2, 3, 4])
  25. ③拆包
  26. In [8]: user_tuple = ("allen", 29, 175)
  27. In [9]: name, age, height = user_tuple
  28. In [10]: print(name, age, height)
  29. allen 29 175
  30. In [11]: name, *other = user_tuple
  31. In [12]: print(name, other)
  32. allen [29, 175]

1.2 tuple对比list的优势

  • 性能更好
  • 线程安全
  • 拆包特性
  • 可以作为dict的key(可hash),如下:
  1. In [14]: user_info_dict = {}
  2. In [15]: user_info_dict[user_tuple] = "allen"
  3. In [16]: user_info_dict
  4. Out[16]: {('allen', 29, 175): 'allen'}
  5. In [17]: user_info_dict[[1,2,3]] = "Kobe"
  6. ---------------------------------------------------------------------------
  7. TypeError Traceback (most recent call last)
  8. <ipython-input-17-a32e731657ac> in <module>()
  9. ----> 1 user_info_dict[[1,2,3]] = "Kobe"
  10. TypeError: unhashable type: 'list'

对应C语言来说,tuple对应的是struct,而list对应的是array

1.3 nametuple创建一个User类

  1. In [23]: from collections import namedtuple
  2. In [24]: User = namedtuple("User", ["name", "age", "height", "edu"])
  3. In [25]: user = User(name="Allen", age=29, height=175, edu="master")
  4. In [26]: print(user.age, user.name, user.height, user.edu)
  5. 29 Allen 175 master
  6. # 加一个字段
  7. In [29]: user_tuple = ("Allen", 29, 175)
  8. In [30]: user = User(*user_tuple, "master")
  9. # user = User("Allen", 29, 175, "master")
  10. In [31]: user
  11. Out[31]: User(name='Allen', age=29, height=175, edu='master')
  12. In [33]: user_dict = {"name":"allen","age":19,"height":175}
  13. In [34]: user = User(**user_dict, edu="master")
  14. In [35]: user
  15. Out[35]: User(name='allen', age=19, height=175, edu='master')

1.4 看两个方法

  • _make() 传入一个可迭代对象初始化namedtuple,灵活性不如前面直接传参
  1. In [36]: user_tuple = ("Allen", 29, 175, "edu")
  2. In [37]: user = User._make(user_tuple)
  3. In [38]: user_list = ["Allen", 29, 175, "edu"]
  4. In [39]: user = User._make(user_list)
  5. In [42]: user_dict = {"name":"allen","age":19,"height":175, "edu":"master"}
  6. In [43]: user = User._make(user_dict)
  • _asdict() 将tuple转为dict
  1. - In [46]: user = User(name="Allen", age=29, height=175, edu="master")
  2. In [47]: user_info_dict = user._asdict()
  3. In [48]: user_info_dict
  4. Out[48]:
  5. OrderedDict([('name', 'Allen'),
  6. ('age', 29),
  7. ('height', 175),
  8. ('edu', 'master')])
  9. tips:namedtuple也可以拆包,如下
  10. In [49]: name, age, *other =user
  11. In [50]: print(name, age, other)
  12. Allen 29 [175, 'master']

Ⅱ、defaultdict

需求:统计一个列表中每个元素的个数

  • 老式方法
  1. In [70]: a = [1,2,3,2,3,2,3,2,4,4,4,5]
  2. In [71]: c_dict = {}
  3. In [72]: for i in a:
  4. ...: if i not in c_dict:
  5. ...: c_dict[i] = 1
  6. ...: else:
  7. ...: c_dict[i] += 1
  8. ...:
  9. In [73]: c_dict
  10. Out[73]: {1: 1, 2: 4, 3: 3, 4: 3, 5: 1}
  • 另一个方法:
  1. In [63]: a = [1,2,3,2,3,2,3,2,4,4,4,5]
  2. In [64]: c_dict = {}
  3. In [65]: for i in a:
  4. ...: c_dict.setdefault(i,0)
  5. ...: c_dict[i] += 1
  6. ...:
  7. In [66]: c_dict
  8. Out[66]: {1: 1, 2: 4, 3: 3, 4: 3, 5: 1}
  • 最好的方法
  1. In [77]: from collections import defaultdict
  2. In [78]: c_dict = defaultdict(int)
  3. In [79]: a = [1,2,3,2,3,2,3,2,4,4,4,5]
  4. In [80]: for i in a:
  5. ...: c_dict[i] += 1 #当key不存在时不会报错,绑一个0
  6. ...:
  7. In [81]: c_dict
  8. Out[81]: defaultdict(int, {1: 1, 2: 4, 3: 3, 4: 3, 5: 1})

弄个自定义的带嵌套的玩一下

  1. In [82]: def gen_default():
  2. ...: return {
  3. ...: "name":"",
  4. ...: "nums":0
  5. ...: }
  6. ...:
  7. ...:
  8. In [83]: default_dict = defaultdict(gen_default)
  9. In [85]: default_dict["test"]
  10. Out[85]: {'name': '', 'nums': 0}

Ⅲ、deque

deque GIL是线程安全的,list不是

deque叫做双端队列,那我们就得和list一起看,先看下list

  1. In [86]: a_list = [1,2]
  2. In [87]: t = a_list.pop()
  3. In [88]: print(t, a_list)
  4. 2 [1]
  5. 可以看到最后一个元素被弹出来了

3.1 弄最左边

  • 插左边
  1. In [94]: from collections import deque
  2. In [95]: a_deque = deque([1, [2, 3], 4])
  3. In [96]: a_deque.appendleft(5)
  4. In [97]: a_deque
  5. Out[97]: deque([5, 1, [2, 3], 4])
  • 弹左边
  1. In [97]: a_deque
  2. Out[97]: deque([5, 1, [2, 3], 4])
  3. In [98]: a_deque.popleft()
  4. Out[98]: 5

3.2 copy()

  1. In [99]: a = deque([1,[2, 3], 4])
  2. In [100]: b = a.copy()
  3. In [101]: print(a, b)
  4. deque([1, [2, 3], 4]) deque([1, [2, 3], 4])
  5. In [102]: print(id(a), id(b))
  6. 139908896451392 139908896452328
  7. In [103]: b[1].append(5)
  8. In [104]: print(a, b)
  9. deque([1, [2, 3, 5], 4]) deque([1, [2, 3, 5], 4])
  10. 由上可知,这种copy是浅拷贝
  • 深拷贝怎么弄?

    deque本身没提供,需要用到copy这个包
  1. In [106]: import copy
  2. In [107]: a = deque([1,[2, 3], 4])
  3. In [108]: b = copy.deepcopy(a)
  4. In [109]: b[1].append(5)
  5. In [110]: print(a, b)
  6. deque([1, [2, 3], 4]) deque([1, [2, 3, 5], 4])

3.3 extend()

  1. In [111]: a = deque([1,2,3])
  2. In [112]: b = deque([4,5,6])
  3. In [113]: a.extend(b)
  4. In [114]: a
  5. Out[114]: deque([1, 2, 3, 4, 5, 6])
  6. 注意:这是直接在a上动态扩容,并不会返回一个新的列表,所以c = a.extend(b)是错的

3.4 其他方法

  1. In [114]: a
  2. Out[114]: deque([1, 2, 3, 4, 5, 6])
  3. In [115]: a.insert(1,888)
  4. In [116]: a.reverse()
  5. In [117]: print(a)
  6. deque([6, 5, 4, 3, 2, 888, 1])
  7. extendleft(),index(),count(),clear()等这里就不演示了

Ⅳ、Counter()

  1. In [122]: from collections import Counter
  2. In [123]: tmp = "132531321059823"
  3. In [124]: t_count = Counter(tmp)
  4. In [125]: t_count
  5. Out[125]: Counter({'1': 3, '3': 4, '2': 3, '5': 2, '0': 1, '9': 1, '8': 1})
  6. # 找top
  7. In [126]: t_count.most_common(2)
  8. Out[126]: [('3', 4), ('1', 3)]

两个串合起来统计

  1. In [126]: t_count.most_common(2)
  2. Out[126]: [('3', 4), ('1', 3)]
  3. In [127]: t_count.update("3311")
  4. In [128]: t_count.most_common(2)
  5. Out[128]: [('3', 6), ('1', 5)]
  6. 再来一把
  7. In [129]: tmp2 = "3311"
  8. In [130]: t_count.update(tmp2)
  9. In [131]: t_count.most_common(2)
  10. Out[131]: [('3', 8), ('1', 7)]

Ⅴ、OrderedDict

字典中的元素本来是无序的,下面这个用了OrderedDict,有序了(添加顺序),python2中和原来的Dict对比就能看出区别,3看不出来

  1. In [141]: from collections import OrderedDict
  2. In [142]: t_dict = OrderedDict()
  3. In [143]: t_dict["b"] = "2b"
  4. In [144]: t_dict["a"] = "1a"
  5. In [145]: t_dict["c"] = "3c"
  6. In [146]: t_dict
  7. Out[146]: OrderedDict([('b', '2b'), ('a', '1a'), ('c', '3c')])

5.1 一些方法

  1. In [146]: t_dict
  2. Out[146]: OrderedDict([('b', '2b'), ('a', '1a'), ('c', '3c')])
  3. In [147]: print(t_dict.pop("a"))
  4. 1a
  5. In [149]: print(t_dict.popitem())
  6. ('c', '3c')
  7. pop()必须指定key,popitem()不用,默认弹出最后一组key:value

把指定元素放到最后

  1. In [155]: t_dict
  2. Out[155]: OrderedDict([('a', '1a'), ('c', '3c'), ('b', '2b')])
  3. In [156]: t_dict.move_to_end("a")
  4. In [157]: t_dict
  5. Out[157]: OrderedDict([('c', '3c'), ('b', '2b'), ('a', '1a')])

Ⅵ、ChainMap

实现访问多个dict就像访问一个dict一样(在多个字典上套一个迭代器)

  1. In [160]: from collections import ChainMap
  2. In [161]: dt1 = {"a":"bb1","b":"bb2"}
  3. In [162]: dt2 = {"a":"bb1","b":"bb2"}
  4. In [163]: n_dt = ChainMap(dt1, dt2)
  5. In [164]: n_dt
  6. Out[164]: ChainMap({'a': 'bb1', 'b': 'bb2'}, {'a': 'bb1', 'b': 'bb2'})
  7. # 加一个新的字典
  8. In [165]: n_dt = n_dt.new_child({"e":"ee5"})
  9. In [166]: n_dt
  10. Out[166]: ChainMap({'e': 'ee5'}, {'a': 'bb1', 'b': 'bb2'}, {'a': 'bb1', 'b': 'bb2'})
  11. # 将字典变成列表(maps指向原来的字典,并不是新生成的一个数据)
  12. In [168]: n_dt.maps
  13. Out[168]: [{'e': 'ee5'}, {'a': 'bb1', 'b': 'bb2'}, {'a': 'bb1', 'b': 'bb2'}]
  14. In [171]: n_dt.maps[1]["a"] = "ahaha"
  15. In [173]: for key, value in n_dt.items():
  16. ...: print(key, value)
  17. ...:
  18. a ahaha
  19. b bb2
  20. e ee5

python常用模块——collections的更多相关文章

  1. python常用模块collections os random sys

    Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python 代码段. 把相关的代码 ...

  2. Python常用模块--collections

    collections是Python中一个非常强大的容器数据模块. 1.创建升级版的元组--namedtupe Python的元组(1,2,3)具有不可变性,但是单独的元组在无法满足现有需求时,可以使 ...

  3. python常用模块---collections、time、random、os、sys、序列号模块

    collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict. ...

  4. python常用模块(1):collections模块和re模块(正则表达式详解)

    从今天开始我们就要开始学习python的模块,今天先介绍两个常用模块collections和re模块.还有非常重要的正则表达式,今天学习的正则表达式需要记忆的东西非常多,希望大家可以认真记忆.按常理来 ...

  5. Python之常用模块--collections模块

    认识模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的 ...

  6. python常用模块详解

    python常用模块详解 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用p ...

  7. Python常用模块——目录

    Python常用模块学习 Python模块和包 Python常用模块time & datetime &random 模块 Python常用模块os & sys & sh ...

  8. python常用模块集合

    python常用模块集合 Python自定义模块 python collections模块/系列 Python 常用模块-json/pickle序列化/反序列化 python 常用模块os系统接口 p ...

  9. Python常用模块之sys

    Python常用模块之sys sys模块提供了一系列有关Python运行环境的变量和函数. 常见用法 sys.argv 可以用sys.argv获取当前正在执行的命令行参数的参数列表(list). 变量 ...

随机推荐

  1. 题解-AtCoder Code-Festival2017 Final-J Tree MST

    Problem \(\mathrm{Code~Festival~2017~Final~J}\) 题意概要:一棵 \(n\) 个节点有点权边权的树.构建一张完全图,对于任意一对点 \((x,y)\),连 ...

  2. Lua中的一些库(1)

    [数学库] 数学库(math)由一组标准的数学函数构成.这里主要介绍几个常用的函数,其它的大家可以自行百度解决. 三角函数(sin,cos,tan……)所有的三角函数都使用弧度单位,可以用函数deg( ...

  3. PostgreSQL快速入门

    一.PostgreSQL是什么? PostgreSQL是一个功能强大的开源对象关系数据库管理系统(ORDBMS). 用于安全地存储数据; 支持最佳做法,并允许在处理请求时检索它们. PostgreSQ ...

  4. 【原创】大数据基础之Mesos(1)简介、安装、使用

    Mesos 1.7.1 官方:http://mesos.apache.org/ 一 简介 Program against your datacenter like it’s a single pool ...

  5. RDay2-Problem 1 A

    题目描述 初始给你一个排列p[i],你可以执行以下操作任意多次. 选择一个i,交换p[i]和p[i+1]的值(其实就是交换排列当中两个相邻的元素). 我们现在希望对于任意的i满足p[i]不等于i,求最 ...

  6. hash与encrypt

    概括来说,哈希(Hash)是将目标文本转换成具有相同长度的.不可逆的杂凑字符串(或叫做消息摘要),而加密(Encrypt)是将目标文本转换成具有不同长度的.可逆的密文. 具体来说,两者有如下重要区别: ...

  7. BAT批处理中的字符串处理详解(字符串截取)

    BAT批处理中的字符串处理详解(字符串截取)   BAT批处理中的字符串处理详解(字符串截取 批处理有着具有非常强大的字符串处理能力,其功能绝不低于C语言里面的字符串函数集.批处理中可实现的字符串处理 ...

  8. Nginx Linux详细安装部署教程

    一.Nginx简介 Nginx是一个web服务器也可以用来做负载均衡及反向代理使用,目前使用最多的就是负载均衡,具体简介我就不介绍了百度一下有很多,下面直接进入安装步骤 二.Nginx安装 1.下载N ...

  9. sonar-代码扫描

    代码测试sonar 1.下载地址: https://www.sonarqube.org/downloads/ 2.配置jdk环境(版本要求1.8+) [root@localhost#>> ...

  10. C++运算符重载——类型转换

    类型转换函数能够实现把一个类 类型 转换成 基本数据类型(int.float.double.char等) 或者 另一个类 类型. 其定义形式如下,注意不能有返回值,不能有参数,只能返回要转换的数据类型 ...