Python基础17(collections模块)

collections模块(python中的扩展数据类型)

  python内置函数:dict、list、set、tuple

  collections模块提供的额外数据类型:

  1.namedtuple: 生成可以使用名字来访问元素内容的tuple

  2.deque: 双端队列,可以快速的从另外一侧追加和推出对象

  3.Counter: 计数器,主要用来计数

  4.OrderedDict: 有序字典

  5.defaultdict: 带有默认值的字典

  namedtuple

1 from collections import namedtuple
2 Point = namedtuple('point',['x','y'])
3 p = Point(1,3)
4 p.x  # 显示1
5 p.y  # 显示3
6 p  # point(x=1, y=3)

  用坐标和半径表示一个圆,也可以用namedtuple定义:

1 from collections import namedtuple
2 #namedtuple('名称', [属性list]):
3 Circle = namedtuple('Circle',['x','y','r'])
4 p = Circle(1,3,2)
5 p.x  # 显示1
6 p.y  # 显示3
7 p  # point(x=1, y=3, r=2)

  deque

  使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。

  deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:

1 from collections import deque
2 q = deque(['a', 'b', 'c'])
3 q.append('x')
4 q.appendleft('y')
5 q
6 # 结果:deque(['y', 'a', 'b', 'c', 'x'])

  deque除了实现list的append()pop()外,还支持appendleft()popleft(),这样就可以非常高效地往头部添加或删除元素。

  OrderedDict

  使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。

  如果要保持Key的顺序,可以用OrderedDict

1 from collections import OrderedDict
2 d = dict([('a', 1), ('b', 2), ('c', 3)])
3 d # dict的Key是无序的
4 {'a': 1, 'c': 3, 'b': 2}
5 od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
6 od # OrderedDict的Key是有序的
7 OrderedDict([('a', 1), ('b', 2), ('c', 3)])

   意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序:

1 from collections import OrderedDict
2 od = OrderedDict()
3 od['z'] = 1
4 od['x'] = 2
5 print(od.keys())  # 按照插入的Key的顺序返回
6 # 结果:odict_keys(['z', 'x'])

  defaultdict字典

   集合[1,2,3,4,5,6,7,8,9],将所有大于5的存在第一个key中,经所有小于5的存在第二个key中。

  实例:{‘key1’:[1,2,3,4,]'key2':[6,7,8,9]}

  原生方法:

 1 lis = [1, 2, 3, 4, 5, 6, 7, 8, 9]
 2 dic = {}
 3 for i in lis:
 4     if i > 5:
 5         if 'key1' in dic:  # python2.2之前版本判断键是否在字典里方法 dic.has_key['key1']: 返回True或者False
 6             dic['key1'].append(i)
 7         else:
 8             dic['key1'] = [i]
 9     if i < 5:
10         if 'key2' in dic:
11             dic['key2'].append(i)
12         else:
13             dic['key2'] = [i]
14 print(dic)
15 #结果:{'key2': [1, 2, 3, 4], 'key1': [6, 7, 8, 9]}

  defaultdict字典解决方法

 1 from collections import defaultdict
 2 
 3 lis = [1, 2, 3, 4, 5, 6, 7, 8, 9]
 4 dic = defaultdict(list)
 5 for i in lis:
 6     if i > 5:
 7         dic['key1'].append(i)
 8     if i < 5:
 9         dic['key2'].append(i)
10 print(dic)
11 # 结果:defaultdict(<class 'list'>, {'key2': [1, 2, 3, 4], 'key1': [6, 7, 8, 9]})

  使dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict

1 def info():
2     return 'N/A'
3 from collections import defaultdict
4 dic = defaultdict(info)  # 可以写成匿名函数  dic = defaultdict(lambda :'N/A')
5 dic['k1'] = 'abc'
6 print(dic['k1'])  # 存在
7 print(dic['k2'])  # 不存在
8 # 结果abc
9 # N/A

  Counter类:计数

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

1 from collections import Counter
2 count = Counter('jfiuwiuriowjej29ue9we90[euwiejiwu0921')
3 print(count)
4 # 结果:Counter({'i': 5, 'u': 5, 'w': 5, 'e': 5, 'j': 4, '9': 4, '2': 2, '0': 2, 'f': 1, 'r': 1, 'o': 1, '[': 1, '1': 1})

 

posted @ 2018-01-11 16:17  争-渡  阅读(129)  评论(0)    收藏  举报