Python — collection
- 2020 年 1 月 8 日
- 筆記
collection 數據容器
Python擁有一些內置的數據類型,比如str, int, list, tuple, dict等, collections
模塊在這些內置數據類型的基礎上,提供了幾個額外的數據類型:
namedtuple()。創建有名字域的元組子類的工廠函數。python 2.6新增。
deque:雙端隊列,類似於列表,兩端進棧和出棧都比較快速。python 2.4新增。
Counter:字典的子類,用於統計哈希對象。python 2.7新增。
OrderedDict:字典的子類,記錄了添加順序。python 2.7新增。
defaultdict:dict的子類,調用一個工廠函數支持不存在的值。python 2.5新增。
還提供了抽象基類,用來測試類是否提供了特殊接口,比如是哈希或者映射。
class {typename}(tuple): # 可命名元祖 '{typename}({arg_list})'
namedtuple主要用來產生可以使用名稱來訪問元素的數據對象,通常用來增強代碼的可
讀性, 在訪問一些tuple類型的數據時尤其好用。
def _make(cls, iterable, new=tuple.__new__, len=len):
from collections import namedtuple
websites = [ ('Sohu', 'http://www.google.com/', '張朝陽'), ('Sina', 'http://www.sina.com.cn/', '王志東'), ('163', 'http://www.163.com/', '丁磊') ] Website = namedtuple('Website', ['name', 'url', 'founder']) for website in websites: website = Website._make(website) print(website)
結果如下:
Website(name='Sohu', url='http://www.google.com/', founder='張朝陽')
Website(name='Sina', url='http://www.sina.com.cn/', founder='王志東')
Website(name='163', url='http://www.163.com/', founder='丁磊')
def _replace(_self, **kwds):
def _asdict(self):
class Counter(dict): # 計數器
Counter() 的可用方法如下:
def most_common(self, n=None): # 獲取出現頻率最高的幾個元素
def elements(self): # 獲取所有元素
例:
import collections
c1=collections.Counter ('sdfsdgasdhgd')
print c1
print c1.most_common(3)
for i in c1.elements():
print i
C:Python27python.exe "E:/python-file/learn – python.py"
Counter({'d': 4, 's': 3, 'g': 2, 'a': 1, 'f': 1, 'h': 1})
[('d', 4), ('s', 3), ('g', 2)]
a
d
d
d
d
g
g
f
h
s
s
s
Process finished with exit code 0
def update(*args, **kwds): # 有新添加的就添加到 collections.Counter()
>>> c1
Counter({'d': 4, 's': 3, 'g': 2, 'h': 1, 'f': 1, 'a': 1})
>>> c2
Counter({'a': 2, 'd': 1, 'c': 1, 'b': 1})
>>> c1.update(c2)
>>> c1
Counter({'d': 5, 's': 3, 'a': 3, 'g': 2, 'h': 1, 'c': 1, 'b': 1, 'f': 1})
def subtract(*args, **kwds): # 相減 後 添加到 collections.Counter()
>>> c1
Counter({'d': 5, 's': 3, 'a': 3, 'g': 2, 'h': 1, 'c': 1, 'b': 1, 'f': 1})
>>> c1.subtract(c2)
>>> c1
Counter({'d': 4, 's': 3, 'g': 2, 'h': 1, 'f': 1, 'a': 1, 'c': 0, 'b': 0})
def copy(self): # 淺層copy,只拷貝一層如有多層則一層之下默認指向深層地址
class OrderedDict(dict): # # 有序字典
區別無序字典及有序字典的實例:
import collections
c1=collections.OrderedDict ()
c1['k1']=1
c1['k3']=1
c1['k5']=1
c1['k2']=1
print c1
c1={}
c1['k1']=1
c1['k3']=1
c1['k5']=1
c1['k2']=1
print c1
結果如下:
OrderedDict([('k1', 1), ('k3', 1), ('k5', 1), ('k2', 1)]) —有序字典
{'k3': 1, 'k2': 1, 'k1': 1, 'k5': 1} —無序字典
自定義有序字典,字典變成有序的字典
c1={}
c1['k1']=1
c1['k3']=3
c1['k5']=5
c1['k2']=2
print c1
li=['k1','k2','k3','k5']
for i in li:
print c1[i]
C:Python27python.exe "E:/python-file/learn – python.py"
{'k3': 3, 'k2': 2, 'k1': 1, 'k5': 5}
1
2
3
5
Process finished with exit code 0
有序字典方法,默認繼承無序字典方法,如下:
def clear(self): # 默認清除所有元素
>>> c2
OrderedDict([(0, 2), (1, 2), (2, 2)])
>>> c2.clear()
>>> c2
OrderedDict()
def copy(self): # 淺copy
>>> c2 = c1.copy()
>>> c2
OrderedDict([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1))
def fromkeys(cls, S, v=None): # (參見字典類)
>>> c2=c1.fromkeys((i for i in range(3)),2)
>>> c2
OrderedDict([(0, 2), (1, 2), (2, 2)])
def items(self, *args, **kwargs): # 有序字典同樣具有字典的方法
>>> c1
OrderedDict([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1)])
>>> c1.items()
odict_items([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1)])
def keys(self, *args, **kwargs): # 有序字典中所有元素的key值
>>> c1
OrderedDict([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1)])
>>> c1.keys()
odict_keys(['k4', 'k2', 'k3', 'k5'])
def move_to_end(self, *args, **kwargs): # 將某一元素移到最後
>>> c1
OrderedDict([('k4', 1), ('k5', 1), ('k2', 1), ('k3', 1)])
>>> c1.move_to_end('k5')
>>> c1
OrderedDict([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1)])
def pop(self, k, d=None): # 刪除某一元素,需要添加key值(見popitem)
def popitem(self): # 刪除元素,默認從最後刪除無序添加key值
>>> c1
OrderedDict([('k4', 1), ('k5', 1), ('k2', 1), ('k3', 1), ('k1', 1)])
>>> c1.popitem()
('k1', 1)
>>> c1.pop()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Required argument 'key' (pos 1) not found
def setdefault(self, k, d=None): # 添加元素設置默認值,默認第二個參數為None
>>> c1.setdefault(2,'v2')
'v2'
>>> c1
OrderedDict([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1), (2, 'v2')])
def update(self, *args, **kwargs): # 更新有序字典
>>> c1
OrderedDict([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1)])
>>> c2
OrderedDict([(0, 2), (1, 2), (2, 2)])
>>> c1.update(c2)
>>> c1
OrderedDict([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1), (0, 2),
(1, 2), (2, 2)])
def values(self, *args, **kwargs): # 有序字典中所有元素的values值
>>> c1
OrderedDict([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1)])
>>> c1.values()
odict_values([1, 1, 1, 1])
class deque(object): # 雙向隊列
def append(self, *args, **kwargs): # 右側添加
>>> d2
deque([ '>', '-', '-', '-', '<'])
>>> d2.append('-')
deque([ '>', '-', '-', '-', '<','-'])
def appendleft(self, *args, **kwargs): # 左側添加
>>> d2
deque([ '>', '-', '-', '-', '<'])
>>> d2.appendleft('-')
deque([ '-','>', '-', '-', '-', '<'])
def clear(self, *args, **kwargs): # 清除所有元素
def copy(self, *args, **kwargs): # 淺層copy
>>> d2
deque([ '>', '-', '-', '-', '<'])
>>> d3=d2.copy()
def count(self, value): #
>>> d2
deque([ '>', '-', '-', '-', '<'])
>>> d2.count('-')
3
def extend(self, *args, **kwargs): # 右側擴展
>>> d3
deque(['1', '2', '3'])
>>> d2
deque([ '>', '-', '-', '-', '<'])
>>> d2.extendleft(d3)
>>> d2
deque([ '>', '-', '-', '-','<','1', '2', '3'])
def extendleft(self, *args, **kwargs): # 左側擴展
>>> d3
deque(['1', '2', '3'])
>>> d2
deque([ '>', '-', '-', '-', '<'])
>>> d2.extendleft(d3)
>>> d2
deque(['3','2', '1', '>', '-', '-', '-','<'])
def index(self, value, start=None, stop=None): # 索引
>>> d2
deque(['3', ',', '2', ',', '1', '–', '>', '-', '-', '-', '-','<'])
>>> d2.index('2')
2
def insert(self, index, p_object): # 可在指定位置插入
>>> d3
deque(['1', '2', '3'])
>>> d3.insert(1,'4')
>>> d3
deque(['1', '4', '2', '3'])
def pop(self, *args, **kwargs): # 右側刪除
>>> d3
deque(['1', '4', '2', '3'])
>>> d3.pop()
'3'
def popleft(self, *args, **kwargs): # 左側刪除
>>> d3.popleft()
'1'
>>> d3
deque(['4', '2'])
def remove(self, value): # 刪除某一元素,需要加參數
>>> d3.remove('4')
>>> d3
deque(['2'])
def reverse(self): # 反轉
>>> d3
deque(['1', '2', '3'])
>>> d3.reverse()
>>> d3
deque(['3', '2', '1'])
def rotate(self, *args, **kwargs): # 下面這個是一個有趣的例子,主要使用了
deque的rotate方法來實現了一個無限循環的加載動畫
import sys
import time
from collections import deque
de = deque('>————<')
while True:
print('r %s ' % (''.join(de)))
de.rotate(1)
sys.stdout.flush()
time.sleep(1)
結果如下:
>————<
<>————
-<>———–
–<>———-
—<>———