使用deque(maxlen=N)構造函數會新建一個固定大小的隊列.當新的元素加入並且這個隊列已滿的時候,最老的元素會被移除掉.在隊列兩端插入或者刪除元素時間複雜度都是O(1), 而在列表的開頭插入或刪除元素的時間複雜度爲O(N).
當要查找的元素個數相對比較小的時候,函數 nlargest()
和 nsmallest()
是很合適的。 如果你僅僅想查找唯一的最小或最大(N=1)的元素的話,那麼使用 min()
和 max()
函數會更快些。 類似的,如果N的大小和集合大小接近的時候,通常先排序這個集合然後再使用切片操作會更快點 (sorted(items)[:N]
或者是 sorted(items)[-N:]
)。 需要在正確場合使用函數 nlargest()
和nsmallest()
才能發揮它們的優勢 (如果N快接近集合大小了,那麼使用排序操作會更好些)
2. 字符串和文本
re.split(r'[;,\s]\s*]', line)
re.split(r'(;|,|\s)\s*', line)
re.split(r'(?:,|;|\s)\s*', line)
[name for name in filenames if name.endswith(('.c', '.h'))]
re.match('http:|https:|ftp:', url) # match()
方法僅僅檢查字符串的開始部分。
from fnmatch import fnmatch, fnmatchcase
fnmatch('foo.txt', '*.txt')
如果你的代碼需要做文件名的匹配,最好使用 glob
模塊。
如果你想使用同一個模式去做多次匹配,你應該先將模式字符串預編譯爲模式對象。
datepat.findall(text)
datepat.finditer(text)
如果你打算做大量的匹配和搜索操作的話,最好先編譯正則表達式,然後再重複使用它。 模塊級別的函數會將最近編譯過的模式緩存起來,因此並不會消耗太多的性能, 但是如果使用預編譯模式的話,你將會減少查找和一些額外的處理損耗。
text.replace('yeah', 'yep')
re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text)
datepat.sub(r'\3-\1-\2', text)
對於更加複雜的替換,可以傳遞一個替換回調函數來代替.一個替換回調函數的參數是一個 match
對象,也就是 match()
或者 find()
返回的對象。 使用group()
方法來提取特定的匹配部分。回調函數最後返回替換字符串。
def change_date(m):
mon_name = month_abbr[(m.group())] .format(m.group(), mon_name, m.group()) (datepat.sub(change_date, text))
newtext, n = datepat.subn(r'\3-\1-\2', text)
def matchcase(word): def replace(m): text = m.group() if text.isupper(): return word.upper() elif text.islower(): return word.lower() elif text[0].isupper(): return word.capitalize() else: return word return replace
re.sub('python', matchcase('snake'), text, flags=re.IGNORECASE)
在一個模式字符串中,點(.)匹配除了換行外的任何字符。通過在 *
或者 +
這樣的操作符後面添加一個 ?
可以強制匹配算法改成尋找最短的可能匹配。