文章目录
collections的常用类型有:
- 计数器(Counter)
- 默认字典(defaultdict)
- 有序字典(OrderedDict)
- 双向队列(deque)
- 可命名元组(namedtuple)
下面我们来一一介绍。
1. 计数器-Counter
Counter 作为字典(dict)的一个子类用来进行哈希计数
,将元素进行数量统计、计数后返回一个字典:键值为元素,值为元素个数
。
1.1 创建Counter
from collections import Counter
s = 'abcbcaccbbad'
l = ['a','b','c','c','a','b','b']
d = {'2': 3, '3': 2, '17': 2}
# Counter 获取各元素的个数,返回字典
print(Counter(s)) # Counter({'c': 4, 'b': 4, 'a': 3})
print(type(Counter(s))) #<class 'collections.Counter'>
print(Counter(l)) # Counter({'b': 3, 'a': 2, 'c': 2})
print(Counter(d)) # Counter({3: 3, 2: 2, 17: 1})
输出:
Counter({'b': 4, 'c': 4, 'a': 3, 'd': 1})
<class 'collections.Counter'>
Counter({'b': 3, 'a': 2, 'c': 2})
Counter({'2': 3, '3': 2, '17': 2})
1.2 次数排序-most_common
按照元素出现的次数由高到低
进行排序,并返回一个list
。
from collections import Counter
s = 'abcbcaccbbad'
s_counter = Counter(s)
print(s_counter)
print(s_counter.most_common(3))
输出:
Counter({'b': 4, 'c': 4, 'a': 3, 'd': 1})
[('b', 4), ('c', 4), ('a', 3)]
1.3 返回经过排序的key-elements
elements 返回经过计数器Counter后的元素,返回的是一个迭代器
。
from collections import Counter
s = 'abcbcaccbbad'
s_counter = Counter(s)
for i in s_counter.elements(): #或者可以转化为list
print(i)
输出:
a
a
a
b
b
b
b
c
c
c
c
d
1.4 加法更新-update
从一个集合中增加元素
from collections import Counter
s = 'abcbcaccbbad'
s_counter = Counter(s)
print(s_counter)
# 方法1:
s_counter.update('ef')
#方法2:
# s_counter.update(Counter('ef'))
print(s_counter)
输出:
Counter({'b': 4, 'c': 4, 'a': 3, 'd': 1})
Counter({'b': 4, 'c': 4, 'a': 3, 'd': 1, 'e': 1, 'f': 1})
1.5 减法操作-substract
从一个集合中删除元素
from collections import Counter
s = 'abcbcaccbbad'
s_counter = Counter(s)
print(s_counter)
# 方法1:
s_counter.subtract('ae') #原始数据中没有e,所以它为-1
#方法2:
# s_counter.subtract(Counter('ae'))
print(s_counter)
输出:
Counter({'b': 4, 'c': 4, 'a': 3, 'd': 1})
Counter({'b': 4, 'c': 4, 'a': 2, 'd': 1, 'e': -1})
1.6 迭代访问
items、keys和values与普通字典一样。
from collections import Counter
s = 'abcbcaccbbad'
s_counter = Counter(s)
print(s_counter)
for i in s_counter.items():
print(i)
输出:
Counter({'b': 4, 'c': 4, 'a': 3, 'd': 1})
('a', 3)
('b', 4)
('c', 4)
('d', 1)
2. 双端队列-deque
deque可以从两端添加和删除元素,是collenctions中常用的模块,它的操作如下图所示:
from collections import deque
str1 = 'abc123cd'
dq = deque(str1)
print(dq)
print('==================元素访问操作================')
print(dq[2])
print('==================增加元素================')
dq.append('right') #右边
dq.appendleft('left')
dq.extend(['ext', 'end']) #右边添加多个
print(dq)
print('==================pop元素================')
dq.pop() #右边pop
dq.popleft() #左边pop
print('a' in dq)
print('==================in操作================')
print('a' in dq)
print('==================插入操作================')
dq.insert(3, "insert")
print(dq)
print('==================删除操作================')
dq.remove('c') #删除第一个元素'c
print(dq)
print('==================旋转操作================')
dq.rotate() #把右边的一个元素放到最左边
print(dq)
输出:
deque(['a', 'b', 'c', '1', '2', '3', 'c', 'd'])
==================元素访问操作================
c
==================增加元素================
deque(['left', 'a', 'b', 'c', '1', '2', '3', 'c', 'd', 'right', 'ext', 'end'])
==================pop元素================
True
==================in操作================
True
==================插入操作================
deque(['a', 'b', 'c', 'insert', '1', '2', '3', 'c', 'd', 'right', 'ext'])
==================删除操作================
deque(['a', 'b', 'insert', '1', '2', '3', 'c', 'd', 'right', 'ext'])
==================旋转操作================
deque(['ext', 'a', 'b', 'insert', '1', '2', '3', 'c', 'd', 'right'])
3. 默认字典-defaultdict
传统字典类型,如果没有默认类型,是无法直接赋值的,如下代码就会报错!
b = dict()
b['k'].append('2') #需要先创建该字典==》b['k'] = 3
默认字典,是字典的一个子类,继承有字典的方法和属性,默认字典在进行定义初始化的时候可以指定字典值得默认类型。
from collections import defaultdict
dic = defaultdict(list)
dic['k'].append('3')
dic['k'].append('4')
print(dic)
输出:
defaultdict(<class 'list'>, {'k': ['3', '4']})
4. 有序字典-OrderedDict
原始字典是无序的,而OrderDict 是一个有序字典,也是字典类型(dict)的一个子类,是对字典的一个补充。
from collections import OrderedDict
# 定义有序字典
dic2 = OrderedDict()
dic2['a'] = '1'
dic2['b'] = '2'
dic2['c'] = '3'
dic2['d'] = '4'
for k, v in dic2.items():
print('有序字典:%s:%s' %(k,v))
输出:
有序字典:a:1
有序字典:b:2
有序字典:c:3
有序字典:d:4
5. 可命名元组-namedtuple
namedtuple是继承自tuple的子类,namedtuple会创建一个和tuple类似的对象,而且它拥有可访问的属性
。
- 定义namedtuple类型
定义一个namedtuple类型User,并包含name,sex和age属性。
User = namedtuple('User', ['name', 'sex', 'age'])
- 创建对象
# 方法一:
user = User(name='kongxx', sex='male', age=21)
#方法二:
user = User._make(['kongxx', 'male', 21])
- 代码示例
from collections import namedtuple
# 定义一个namedtuple类型User,并包含name,sex和age属性。
User = namedtuple('User', ['name', 'sex', 'age'])
user = User(name='qlee', sex='male', age=21)
print(user)
print(user.name)
#修改对象属性
user = user._replace(age=30)
print(user)
# 将User对象转换为字典
user = user._asdict()
print(user)
输出:
User(name='qlee', sex='male', age=21)
qlee
User(name='qlee', sex='male', age=30)
{'name': 'qlee', 'sex': 'male', 'age': 30}