美文网首页
如何使用python3 的 collections 模块/库,C

如何使用python3 的 collections 模块/库,C

作者: LeeMin_Z | 来源:发表于2018-05-10 13:20 被阅读28次

0. 简介

  1. 核心原理与基础信息
  2. 常用功能/函数
    2.1. namedtuple: 命名一个不变列表,简洁的class用法
    2.2 deque 高效增删改双向列表
    2.3 defaultdict key不存在时,返回默认值
    2.4 OrderedDict 有序词典,就是加了个顺序而已
    2.5 Counter 计数

1. 核心原理与基础信息

  1. 核心:有点像个罐子(叫container),里面可以装dict, list, set, and tuple.然后做一些操作。

  2. 注意有点像 以上四类的一个子集,例如 namedtuple() ∈ tuple() ; 如果 g ∈ namedtuple(), 那么g ∈ namedtuple() ∈ tuple() 。其他类似。

subset.png
  1. collections中包含什么函数/功能?
# input
import collections
print(dir(collections))

#output 
['AsyncGenerator', 'AsyncIterable', 'AsyncIterator', 'Awaitable', 'ByteString', 'Callable', 'ChainMap', 'Collection', 'Container', 'Coroutine', 'Counter', 'Generator', 'Hashable', 'ItemsView', 'Iterable', 'Iterator', 'KeysView', 'Mapping', 'MappingView', 'MutableMapping', 'MutableSequence', 'MutableSet', 'OrderedDict', 'Reversible', 'Sequence', 'Set', 'Sized', 'UserDict', 'UserList', 'UserString', 'ValuesView', '_Link', '_OrderedDictItemsView', '_OrderedDictKeysView', '_OrderedDictValuesView', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_chain', '_class_template', '_collections_abc', '_count_elements', '_eq', '_field_template', '_heapq', '_iskeyword', '_itemgetter', '_proxy', '_recursive_repr', '_repeat', '_repr_template', '_starmap', '_sys', 'abc', 'defaultdict', 'deque', 'namedtuple']

2. 常用功能

2.1. namedtuple: 命名一个不变列表,简洁的class用法

  1. 例如我想定义一个三维坐标(x,y,z),可以给他起个名字P3。
  2. 调用tuple元素方式不一样,例如调用三维点a中x轴的值,用a.x, 不能用a[0]。
  3. 这样定义的元素,既属于tuple,又属于P3.

代码1-namedtuple

# input code 
#namedtuple in collections 

from collections import namedtuple

three_diamention_Point = namedtuple('three_diamention_Point',['x','y','z'])

a = three_diamention_Point(1,2,3)
print('point a is : \n',a)
print('the valus on the x axis is : \n', a.x)
#output
point a is : 
 three_diamention_Point(x=1, y=2, z=3)
the valus on the x axis is : 
 1
#check the type
print(isinstance(a,three_diamention_Point))
print(isinstance(a,tuple))

#output 
True
True

代码2-make赋值

>>> t = [11, 22]
>>> Point._make(t)
Point(x=11, y=22)

代码3-更改值

>>> p = Point(x=11, y=22)
>>> p._replace(x=33)
Point(x=33, y=22)

代码4-tuple回顾

# input code 
b = (1,2,3)
print(type(b))
print(b[0])
#output 
<class 'tuple'>
1

2.2 deque 高效增删改双向列表

  1. 类似list,就是在list外面加个deque()定义。好处就是增删改比list快很多。用法差不多。
  2. 适用于队列和栈,例如poppopleft
# input 
from collections import deque
q = deque(['a', 'b', 'c'])
print(dir(deque))

#output
['append', 'appendleft', 'clear', 'copy', 'count', 'extend', 'extendleft', 
'index', 'insert', 'maxlen', 'pop', 'popleft', 'remove', 'reverse', 'rotate']
  1. 反向打印出元素 reversed(),不对原表做操作。跟list类似

3.1 deque

# IN python3.6 
from collections import deque

d =  deque(['a', 'b', 'c'])
c = list(reversed(d))
print(c)
print(d)

# OUT 
['c', 'b', 'a']
deque(['a', 'b', 'c'])

3.2 list

# IN
a = ('a','b','c')
b = list(reversed(a))
print(a)
print(b)

# OUT 
('a', 'b', 'c')
['c', 'b', 'a']
  1. 其他判断存在与否,一次性插入大量元素等等
>>> 'h' in d                         # search the deque
True
>>> d.extend('jkl')                  # add multiple elements at once
>>> d
deque(['g', 'h', 'i', 'j', 'k', 'l'])
>>> d.rotate(1)                      # right rotation
>>> d
deque(['l', 'g', 'h', 'i', 'j', 'k'])
>>> d.rotate(-1)                     # left rotation
>>> d
deque(['g', 'h', 'i', 'j', 'k', 'l'])

>>> deque(reversed(d))               # make a new deque in reverse order
deque(['l', 'k', 'j', 'i', 'h', 'g'])
>>> d.clear()                        # empty the deque
>>> d.pop()                          # cannot pop from an empty deque
Traceback (most recent call last):
    File "<pyshell#6>", line 1, in -toplevel-
        d.pop()
IndexError: pop from an empty deque

>>> d.extendleft('abc')              # extendleft() reverses the input order
>>> d
deque(['c', 'b', 'a'])

2.3 defaultdict key不存在时,返回默认值

>>> from collections import defaultdict
>>> dd = defaultdict(lambda: 'N/A')
>>> dd['key1'] = 'abc'
>>> dd['key1'] # key1存在
'abc'
>>> dd['key2'] # key2不存在,返回默认值
'N/A'

2.4 OrderedDict 有序词典,就是加了个顺序而已

不过Python3.6 开始dict也是有序的,我就说我写了N个例子都是有序...

可以用来写 先进先出 的FIFO

2.5 Counter 计数

好方便,一定要记住。用来计数,可以算字符串,数组list,词典dict,等等。想到就能用的功能。最好用的有most_common([n])

  1. 字符串
# Uses python 3.6 for strings, test 1 
from collections import Counter

c = Counter()

for ch in 'shlasdlan':
    c[ch] +=  1

print(isinstance(c,Counter))
print(isinstance(c,dict))
print(c)
# test 1 output 
True
True
Counter({'s': 2, 'l': 2, 'a': 2, 'h': 1, 'd': 1, 'n': 1})
  1. list 类似
#In 
from collections import Counter

cnt = Counter()
for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
    cnt[word] += 1

print(cnt)

#Out 
Counter({'blue': 3, 'red': 2, 'green': 1})
  1. 引用正则,一行就能对整个文件计数
# IN Uses python 3.6
from collections import Counter
import re
words = re.findall(r'\w+',open('mbox-short.txt').read().lower())
print(Counter(words).most_common(3))

# Out 
[('edu', 461), ('2008', 380), ('jan', 352)]
  1. 可以随便写的函数
>>> from collections import Counter
>>> c = Counter('gallahad')
>>> c
Counter({'a': 3, 'l': 2, 'g': 1, 'h': 1, 'd': 1})
>>> c = Counter({'red': 4, 'blue': 2})
>>> c
Counter({'red': 4, 'blue': 2})
>>> c = Counter(cats=4, dogs=8)
>>> c
Counter({'dogs': 8, 'cats': 4})
>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> c
Counter({'a': 4, 'b': 2, 'c': 0, 'd': -2})
  1. elements() 小于零时不显示
>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> sorted(c.elements())
['a', 'a', 'a', 'a', 'b', 'b']
  1. Counter()还能加减乘除和逻辑运算
>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> d = Counter(a=1, b=2, c=3, d=4)
>>> c.subtract(d)
>>> c
Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})
>>> c = Counter(a=3, b=1)
>>> d = Counter(a=1, b=2)
>>> c + d                       # add two counters together:  c[x] + d[x]
Counter({'a': 4, 'b': 3})
>>> c - d                       # subtract (keeping only positive counts)
Counter({'a': 2})
>>> c & d                       # intersection:  min(c[x], d[x]) 
Counter({'a': 1, 'b': 1})
>>> c | d                       # union:  max(c[x], d[x])
Counter({'a': 3, 'b': 2})

[2018.5.10]
参考资料:

  1. python官方文档 https://docs.python.org/3/library/collections.html

  2. 廖雪峰-python3-collections

  3. In Python 3.6 regular dicts are ordered and more compact

  4. What’s New In Python 3.6

遗留问题:
chainmap暂时不会用

相关文章

网友评论

      本文标题:如何使用python3 的 collections 模块/库,C

      本文链接:https://www.haomeiwen.com/subject/oxinrftx.html