python collections 中的常见函数使用,常见数据类型定义
说明:可以直接根据标题进行查找需要使用的数据和函数
参考链接:
https://docs.python.org/3/library/collections.html?highlight=namedtuple#collections.namedtuple
https://www.jianshu.com/p/246fda8bb1f6
使用 namedtuple() 定义一个元组
named tuple = 命名元组 = namedtuple()
Returns a new tuple subclass named typename. 返回一个带有 typename名称的 元组,可以用于定义二维空间的点
import collections
Point = collections.namedtuple("Point", ["x", "y"])
p = Point(1,2)
print(p, p.x, p.y)
t = [11111, 22222]
print(Point._make(t)) ## 使用 _make(t) 将 t 变成 列表
结果:
Point(x=1, y=2) 1 2
Point(x=11111, y=22222)
使用 deque() 定义队列
Deques are a generalization of stacks and queues。 deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈。
import collections
tmp = collections.deque("a")
tmp.append("b") ## 在右边添加元素
tmp.appendleft("c") ## 在左边添加元素
print(tmp)
#### deque(['c', 'a', 'b'])
tmp.extend(["B", "BB", "BBB"]) ## 添加可迭代对象
tmp.extendleft(["C", "CC", "CCC"]) ## 在左侧添加 可迭代对象
print(tmp)
#### deque(['CCC', 'CC', 'C', 'c', 'a', 'b', 'B', 'BB', 'BBB'])
tmp.insert(1, "123") ## 在某个位置,添加上某个元素
print(tmp)
#### deque(['CCC', '123', 'CC', 'C', 'c', 'a', 'b', 'B', 'BB', 'BBB'])
tmp.rotate(1) # 右旋转 right rotation
print(tmp)
#### deque(['BBB', 'CCC', '123', 'CC', 'C', 'c', 'a', 'b', 'B', 'BB'])
tmp.rotate(-1) # left rotation
print(tmp)
#### deque(['CCC', '123', 'CC', 'C', 'c', 'a', 'b', 'B', 'BB', 'BBB'])
tmp.pop() ## 注意 pop() 内部不能有参数
print(tmp)
#### deque(['CCC', '123', 'CC', 'C', 'c', 'a', 'b', 'B', 'BB'])
tmp.popleft()
print(tmp)
#### deque(['123', 'CC', 'C', 'c', 'a', 'b', 'B', 'BB'])
deque 常用函数 总结
注意:iterable 和 x 的区别
x 代表的是一个数值
iterable 代表的是一个可迭代对象 ,比如 列表 。
使用 deque() 完成列表的移动平均操作 ! 常用于数据处理,统计历史信息的变化趋势上。
另外在看官网的过程中发现:
队列可以完成移动平均的操作,在数据处理过程中很有帮助;
如果数据是以 表格形式给出的话,可以使用 pandas 的 rolling() 完成移动平均操作
def moving_average(iterable, n=3):
# moving_average([40, 30, 50, 46, 39, 44]) --> 40.0 42.0 45.0 43.0
# http://en.wikipedia.org/wiki/Moving_average
'''
iterable 是可迭代对象
n = window size = 窗口大小
'''
it = iter(iterable)
d = deque(itertools.islice(it, n-1))
d.appendleft(0)
s = sum(d)
for elem in it:
s += elem - d.popleft()
d.append(elem)
yield s / n
使用 defaultdict() 定义 字典(可以含有不存在的键)
通过 元组列表 生成字典:
import collections
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
## 元组列表 ## 元组是里面的元素,列表是最终的数据类型 type
d = collections.defaultdict() ## 注意这里并没有指明数据类型
for k, v in s:
d[k] = v
print(d)
#### defaultdict(<class 'list'>, {'yellow': 3, 'blue': 4, 'red': 1})
############## 注意查看 defaultdict() 默认是 list 类型 ###############
import collections
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = collections.defaultdict(list)
for k, v in s:
d[k] = v
print(d)
# defaultdict(<class 'list'>, {'yellow': 3, 'blue': 4, 'red': 1})
对比结果
import collections
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = collections.defaultdict(list) ## 指明了数据类型 list
for k, v in s:
d[k].append(v) ## 注意结果是将所有的值做成了 list
print(d)
#### defaultdict(<class 'list'>, {'yellow': [1, 3], 'blue': [2, 4], 'red': [1]})
既然是字典类型就会存在 .keys() , .values(), .items()
d.keys()
d.values()
d.items()
通过 集合 set() 构建 defaultdict
from collections import defaultdict
s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
d = defaultdict(set)
for k, v in s:
d[k].add(v) ## 元组应该是 add() 操作
print(d.items())
#### dict_items([('red', {1, 3}), ('blue', {2, 4})])
通过 defaultdict 构建 计数器
from collections import defaultdict
s = 'mississippi'
d = defaultdict(int) ## 注意这里是指明了 int 类型的
for k in s:
d[k] += 1 ## 完成计数+1操作
print(d.items())
#### dict_items([('m', 1), ('i', 4), ('s', 4), ('p', 2)])
特殊之处:通过设置可以使得不存在的键会自动用 空值 填充
from collections import defaultdict
dd = defaultdict(lambda : 'N/A')
dd['key1'] = 'abc'
print(dd['key1'])
print(dd['key2'])
注意,如果不进行设置的话,可能会出现:
问: 如何通过 两个列表 得到 存放元组的容器 呢? 可以通过 zip() 函数实现
color = ['yellow', 'blue', 'yellow', 'blue', 'red']
number = [1,2,3,4,1]
s = zip(color, number)
print(type(s))
print(next(iter(s)))
for k, v in zip(color, number):
print(k, v)
# yellow 1
# blue 2
# yellow 3
# blue 4
# red 1
使用 OrderedDict() 完成对字典的 排序任务
例子参考 : https://zhuanlan.zhihu.com/p/110407087
from collections import OrderedDict
# 标准未排序的常规字典
d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
# 按照key排序的字典
OrderedDict(sorted(d.items(), key=lambda t: t[0]))
#### OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
# 按照value排序的字典
OrderedDict(sorted(d.items(), key=lambda t: t[1]))
#### OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
# 按照key的长度排序的字典
OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
#### OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])
使用 Counter() 定义一个计数器 ,用来统计元素的频次
对 字符串元素 进行计数统计
from collections import Counter
c = Counter()
for ch in 'programming':
c[ch] = c[ch] + 1
print(c)
或者:
注意第二种写法,直接了当 !!!
from collections import Counter
c = Counter('programming')
print(c)
#### Counter({'r': 2, 'g': 2, 'm': 2, 'p': 1, 'o': 1, 'a': 1, 'i': 1, 'n': 1})
对 列表元素 进行计数统计
from collections import Counter
c = Counter()
for ch in list('programming'):
c[ch] = c[ch] + 1
print(c)
或者:
注意第二种写法,直接了当 !!!
from collections import Counter
c = Counter(list('programming'))
print(c)
#### Counter({'r': 2, 'g': 2, 'm': 2, 'p': 1, 'o': 1, 'a': 1, 'i': 1, 'n': 1})
Counter() 常见的函数
https://docs.python.org/3/library/collections.html?highlight=chainmap#collections.Counter