数据结构和算法
序列分解为单独的变量
任何序列(或可迭代对象)都可以通过一个简单的赋值操作来分解为单独的变量,唯一的要求是变量的总数和结构要与序列相吻合。
不仅仅只是元组或列表,只要对象恰好是可迭代的,那么就可以执行分解操作,这包括字符串、文件、迭代器以及生成器。
通常用一个用不到的变量名(_)来作为要丢弃的值的名称。
从任意长度的可迭代对象中分解元素
‘*表达式’,‘*_’丢弃多个值。
保存最后N个元素
collections.deque(max=N)创建一个固定长度的队列,当有新纪录加入而队列已满时会自动移除最老的那条纪录。
找出最大或最小的N个元素
heapq.nlargest(n, list),heapq.nsmallest(n, list)
在字典中将键映射到多个值上
用collections.defaultdict。
让字典保持有序
使用collections模块中的OrderedDict()类。当对字典做迭代时,它会严格按照元素初始添加的顺序进行。
与字典有关的计算
通常利用zip()将字典的键和值反转过来。
在两个字典中寻找相同点
通过key()或者items()方法执行常见的集合操作。
从序列中移除重复项且保持元素间顺序不变
如果序列中的值时可哈希的,可以通过集合和生成器解决,否则使用key来排除。
对切片命名
内置的slice()函数会创建一个切片对象,可以用在任何允许进行切片操作的地方,还可以用过slice().star,slice().stop,slice().step属性来得到该对象的信息。
找出序列中出现次数最多的元素
可以使用collections模块中的Counter()类,Counter对象可以同各种数学运算操作结合起来使用。
通过公共键对字典列表排序
利用operator模块中的itemgetter函数对这类结构进行排序。
var = sorted(row, key=itemgetter(key,key,…))
根据字段将记录分组
使用itertools.groupby()函数对数据进行分组,groupby()通过扫描序列找出拥有相同值(或由参数key指定的函数返回的值)的序列项,并将它们分组,groupby()创建了一个迭代器,而在每次迭代时都会返回一个值(value)和一个子迭代器(sub_iterator),这个子迭代器可以产生所有在该分组内具有该值的项。
筛选序列中的元素
可以使用生成器表达式通过迭代的方式产生筛选的结果,itertools.compress()可以接受一个可迭代对象以及一个布尔选择器序列作为输入,输出时,它会给出所有在相应的布尔选择器中为True的可迭代对象元素。
将名称映射到序列的元素中
使用collections.namedtuple(),如果要修改任何属性,可以通过namedtuple实例的_replace()方法来实现。
将多个映射合并为单个映射
利用collections模块中的ChainMap类来解决,如果具有重复的键,会采用第一个映射中所对应的值。
字符串和文本
针对任意多的分隔符拆分字符串
使用re.split()
在字符串的开头或结尾处做文本匹配
如果需要同时针对多个选项做检查,只需给startswith()和endswith()提供包含可能选项的元组即可。
利用Shell通配符做字符串匹配
使用fnmatch.fnmatch(name, 匹配格式)和fnmatchcase(name, 格式)。
文本模式的匹配和查找
使用str.find()、str.endswith()、str.startswith()和re.find()等函数。
查找和替换文本
使用str.replace(),re.sub(模式,替换的模式)