python collections 容器数据类型

这个模块实现了特定目标的容器,以提供Python标准内建容器 dict , list , set , 和 tuple 的替代选择。

namedtuple()

创建命名元组子类的工厂函数

deque

类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop)

ChainMap

类似字典(dict)的容器类,将多个映射集合到一个视图里面

Counter

字典的子类,提供了可哈希对象的计数功能

OrderedDict

字典的子类,保存了他们被添加的顺序

defaultdict

字典的子类,提供了一个工厂函数,为字典查询提供一个默认值

UserDict

封装了字典对象,简化了字典子类化

UserList

封装了列表对象,简化了列表子类化

UserString

封装了列表对象,简化了字符串子类化

 

下面就常用的几种方法举例说明

  1 import collections, re
  2 #courter能够统计可迭代对象中元素出现的次数,对于文件可以统计字符、单词出现的top n的频率;返回结果类型为class collections对象
  3 # .Counter;most_common方法返回值为一个列表,列表的元素为元组,元组内为迭代对象和其出现的次数,在需要排序时使用
  4 list1 = [1, 2, 3, 1, 2, 3, "wo", "jiu", "shi", "wo"]
  5 str1 = "wojiushiwo,buyiyangdewo"
  6 list_counter = collections.Counter(list1)
  7 list_counter_most_common = collections.Counter(list1).most_common()
  8 str_counter = collections.Counter(str1)
  9 print(list_counter, type(list_counter))
 10 print(list_counter_most_common, type(list_counter_most_common))
 11 print(str_counter, type(str_counter))
 12 
 13 #统计文件中top n字符出现的频率,使用此方法操作文件必须使用只读模式,否则会报IO对象不能迭代错误
 14 data1 = open("test_file", encoding="utf-8").read()
 15 file_char_counter = collections.Counter(data1)
 16 print(file_char_counter, type(file_char_counter))
 17 #统计文件中top n单词出现的频率
 18 data2 = re.findall(r"\w+", open("test_file", encoding="utf-8").read())
 19 file_word_counter = collections.Counter(data2)
 20 print(file_word_counter, type(file_word_counter))
 21 
 22 #Counter对象可以转换为字典  列表 集合数据类型;列表内容为源Counter的key;字典内容为原来Counter类型的K:V,集合内容类比List内容
 23 print(list(list_counter), dict(list_counter), set(list_counter))
 24 
 25 #返回一个迭代器,其中每个元素将重复出现计数值所指定次。 元素会按首次出现的顺序返回。 如果一个元素的计数值小于一,elements() 将会忽略它;注意此处字符串不要加引号,否则会报错
 26 element_test = collections.Counter(wo=3, jiu=2, shi=4)
 27 print(element_test.elements())
 28 for iters in element_test.elements():
 29     print(iters)
 30 
 31 #counter对象也支持数学运算
 32 c = collections.Counter(a=3, b=1)
 33 d = collections.Counter(a=1, b=2)
 34 c + d                       # add two counters together:  c[x] + d[x]
 35 c - d                       # subtract (keeping only positive counts)
 36 c & d                       # intersection:  min(c[x], d[x])
 37 c | d                       # union:  max(c[x], d[x])
 38 #单目加和减(一元操作符)意思是从空计数器加或者减去
 39 c = collections.Counter(a=2, b=-4)
 40 print(+c)  #Counter({'a': 2})
 41 print(-c) #Counter({'b': 4})
 42 
 43 #deque对象; collections.deque([iterable[, maxlen]]) 返回一个新的双向队列对象,从左到右初始化(用方法 append()) ,
 44 # 从 iterable (迭代对象) 数据创建。如果 iterable 没有指定,新队列为空。
 45 #maxlen可以指定也可以不指定;不指定时deque可以无限长;
 46 deque1 = collections.deque(list1, 3)
 47 print(deque1, type(deque1)) #deque(['jiu', 'shi', 'wo'], maxlen=3) <class 'collections.deque'>
 48 deque1.append("test") #指定长度以后,当deque长度到达上限后继续append元素会将首元素挤出去,
 49 print(deque1, type(deque1))  #deque(['jiu', 'shi', 'wo'], maxlen=3) <class 'collections.deque'>
 50 """
 51 deque常用方法
 52 append(x)
 53 添加 x 到右端。
 54 appendleft(x)
 55 添加 x 到左端。
 56 clear()
 57 移除所有元素,使其长度为0.
 58 copy()
 59 创建一份浅拷贝。
 60 count(x)
 61 计算 deque 中元素等于 x 的个数。
 62 extend(iterable)
 63 扩展deque的右侧,通过添加iterable参数中的元素。
 64 extendleft(iterable)
 65 扩展deque的左侧,通过添加iterable参数中的元素。注意,左添加时,在结果中iterable参数中的顺序将被反过来添加。
 66 index(x[, start[, stop]])
 67 返回 x 在 deque 中的位置(在索引 start 之后,索引 stop 之前)。 返回第一个匹配项,如果未找到则引发 ValueError。
 68 insert(i, x)
 69 在位置 i 插入 x 。
 70 如果插入会导致一个限长 deque 超出长度 maxlen 的话,就引发一个 IndexError。
 71 pop()
 72 移去并且返回一个元素,deque 最右侧的那一个。 如果没有元素的话,就引发一个 IndexError。
 73 popleft()
 74 移去并且返回一个元素,deque 最左侧的那一个。 如果没有元素的话,就引发 IndexError。
 75 remove(value)
 76 移除找到的第一个 value。 如果没有的话就引发 ValueError。
 77 reverse()
 78 将deque逆序排列。返回 None 。
 79 rotate(n=1)
 80 向右循环移动 n 步。 如果 n 是负数,就向左循环。
 81 如果deque不是空的,向右循环移动一步就等价于 d.appendleft(d.pop()) , 向左循环一步就等价于 d.append(d.popleft()) 。
 82 Deque对象同样提供了一个只读属性:
 83 maxlen
 84 Deque的最大尺寸,如果没有限定的话就是 None 。
 85 """
 86 
 87 """
 88 class collections.defaultdict([default_factory[, ...]])
 89 返回一个新的类似字典的对象。 defaultdict 是内置 dict 类的子类。它重载了一个方法并添加了一个可写的实例变量。其余的功能与 dict 类相同,此处不再重复说明。
 90 本对象包含一个名为 default_factory 的属性,构造时,第一个参数用于为该属性提供初始值,默认为 None。所有其他参数(包括关键字参数)都相当于传递给 dict 的构造函数。
 91 """
 92 #使用 list 作为 default_factory,很轻松地将(键-值对组成的)序列转换为(键-列表组成的)字典:
 93 s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', "wo"), ('red', 1)]
 94 d = collections.defaultdict(list)
 95 for k, v in s:
 96     d[k].append(v)
 97 print(d, type(d))  #defaultdict(<class 'list'>, {'yellow': [1, 3], 'blue': [2, 'wo'], 'red': [1]})
 98 
 99 #设置 default_factory 为 int,使 defaultdict 用于计数;类似于Counter的用法
100 s = 'mississippi'
101 d = collections.defaultdict(int)
102 for k in s:
103     d[k] += 1
104 print(d, type(d))
105 
106 #使用 set 作为 default_factory,很轻松地将(键-值对组成的)序列转换为(键-集合组成的)字典:
107 s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', "wo"), ('red', 1)]
108 d = collections.defaultdict(set)
109 for k, v in s:
110     d[k].add(v)
111 print(d, type(d))  #defaultdict(<class 'set'>, {'yellow': {1, 3}, 'blue': {2, 'wo'}, 'red': {1}})
112 
113 #具名元组
114 name_tuple = collections.namedtuple("name_tuple", ["age", "name", "sex"])
115 name_tuple_obj1 = name_tuple(23, "zsq", "man")
116 print(name_tuple_obj1, type(name_tuple_obj1)) #name_tuple(age=23, name='zsq', sex='man') <class '__main__.name_tuple'>
117 print(name_tuple_obj1.name) #  zsq  创建nametuple时相当于创建了其多个属性,实例化是将实参传入构造函数
118 print(name_tuple_obj1[1]) #zsq 也可以像类似list/tuple使用下标对其进行取值
119 
120 #使用序列初始化nametuplue;序列元素数量必须要与nametuple定义时元素数量一致
121 list2 = [23, "wo", "xx"]
122 name_tuple_obj2 = name_tuple._make(list2)
123 print(name_tuple_obj2)
124 
125 #nametuple实例的_asdict方法
126 name_tuple_asdict1 = name_tuple_obj2._asdict()
127 print(name_tuple_asdict1) #返回一个有序字典 OrderedDict([('age', 23), ('name', 'wo'), ('sex', 'xx')])
128 print(name_tuple_asdict1["name"]) #此种数据类型可以将nametuple定义时的形参作为字典key进行取值

 

上一篇:13.tuple的操作


下一篇:元组与列表的区别