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
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值