1.列表生成式實現笛卡爾積
names = ['張三', '李四', '王麻子']
sexs = ['男', '女', '男']
new_list = [(name, sex) for name in names for sex in sexs]
輸出 new_list 是 3*3=9 個元組
附:
生成器表達式只需將中括號換成小括號即可
生成器表達式逐個產生元素而不是一次性產出一個列表(內存)
這樣有利於避免額外內存佔用
2.具名元組
from collections import namedtuple
city = namedtuple('city', 'name username country age')
tokyo = city('Tokyo', '小胡', '日本', '22')
第一行參數是類名以及它的屬性名稱
第二行是屬性賦值,字段信息獲取和對象一樣
附: 切片賦值必須爲可迭代對象,即是可變型數據類型
缺點: 無法指定各參數的默認值
3.排序區別
a = ['a', 'b', 'dd', 'c']
a.sort() 對a進行排序,不會生成新列表,原存儲位置不變
sorted(a) 會生成新列表,佔據新內存
整形與字符串的排序
l = [0, '1', 2, '3', 11, 25, '25']
print(sorted(l, key=int))
print(sorted(l, key=str))
[0, '1', 2, '3', 11, 25, '25']
[0, '1', 11, 2, 25, '25', '3']
4.雙向隊列
此類是一個線程安全、可以快速從兩端添加或者刪除元素的數據類型
from collections import deque
d = deque(range(10), maxlen=10) 設置最大長度爲10,一旦設置則不能修改
超出則刪除;不設置也可以
d.rotate(2) 設置旋轉2個數字,參數爲正數則將右邊移到左邊,反之相反
print(d)
d.appendleft(-1) 從頭部添加一個元素 -1 ,若超出限制則從右邊刪除
print(d)
d.append(2) 尾部添加,超出則從左邊刪除;extend方法同理
print(d)
結果
deque([8, 9, 0, 1, 2, 3, 4, 5, 6, 7], maxlen=10)
deque([-1, 8, 9, 0, 1, 2, 3, 4, 5, 6], maxlen=10)
deque([8, 9, 0, 1, 2, 3, 4, 5, 6, 2], maxlen=10)
Queue類也是一種隊列類,但當其隊列滿時會被鎖住,直到有空才能使用
5.字典
d = {}
d.setdefault(key, value)
顧名思義,設置默認值。如果原有則無意義,否則添加
d.get() 原有則返回值,否則返回None
實現隊列或棧
from collections import OrderedDict
d = OrderedDict([('1', 1), ('2', 2), ('3', 3)])
d.popitem(last=False)
實現先進先出(隊列), 當沒有 last 參數時,先進後出(棧)
此類型添加鍵時會保持順序
6.簡便統計字典中各元素次數
from collections import Counter
c = Counter('aaabbbvd')
lis = c.most_common()
元素個數元組展示--> [('a',3), ('b',2), ('c',1), ('d',1)]
result = {key: value for key, value in lis}
元素個數字典存儲--字典生成式-->{'a': 3, 'b': 3, 'v': 1, 'd': 1}
7.集合
可變數據類型中僅集合支持 交併補集以及子父集 操作
不可變類型=可散列的
discard() 方法,有則移除,無則不操作
remove() 方法,有則移除, 無則報錯
8.散列表
即哈希表
散列表是一個稀疏數組(總有空白), 集合和字典的實現都依賴它
它在被創建時有一個閾值,當空白小於閾值時會進行擴容,原有的
散列表會被複制到一個更大的空間裏
一個可散列對象支持 hash()函數,若a==b,則hash(a)==hash(b)
字典和集合都是以犧牲空間來換取時間,內存消耗大但查詢速度快
9.編碼與解碼
編碼--encode()用於機器間存儲和傳輸,將字符串變爲字節序列
解碼--decode()用於人類識別, 將字節序列轉爲文本字符串
str.encode('utf8')
bytes.decode('utf8')
編碼的等價交換
a = 'ss'
a = a.encode('utf8')
a = bytes('ss').encode('utf8')
a = bytes('ss', encoding='utf8')
輸出爲 b'ss'
實現字符串轉化爲 bytes類型
使用 errors參數可以將無法解碼的部分用 ? 表示
a.decode('utf8', errors='replace')
聲明編碼格式
# coding: utf-8
10.小問題
with open('xxx.txt', 'wb') as f:
f.write()
會調用系統默認的編碼方式編碼寫入
with open('xxx.txt', 'r') as f:
f.read()
同理,也可以自己設置編碼格式 encoding
正則表達式匹配字節序列
re.compile(rb'\d+')
re.compile(rb'\w+')