1.slice内置函数
slice函数用于创建一个切片对象,可以用于任何需要切片的地方,这样就可以避免了硬编码切片,因为切片不统一导致的问题
>>> sli = slice(2, 12, 2) >>> s = '..h.e.l.l.o....' >>> s[sli] 'hello'
2.排序
Python内置了一个排序函数sorted,可以直接用来对可排序的数据类型进行排序
>>> a = [1, 3, 5, 23, 46, -133.3, 14, 20, 1] >>> sorted(a) [-133.3, 1, 1, 3, 5, 14, 20, 23, 46]
如果是字典呢,sorted函数提供了一个key参数,用于选择要进行排序的元素,可以使用lambda表达式进行选择
>>> a = [{'id': 1, 'name': 'ali'}, ... {'id': 2, 'name': 'caven'}, ... {'id': -2, 'name': 'bit'}] >>> sorted(a, key=lambda x: x['id']) [{'name': 'bit', 'id': -2}, {'name': 'ali', 'id': 1}, {'name': 'caven', 'id': 2}] >>> sorted(a, key=lambda x: x['name']) [{'name': 'ali', 'id': 1}, {'name': 'bit', 'id': -2}, {'name': 'caven', 'id': 2}]当然,Python为我们提供了更好的选择,operator中的itemgetter函数
>>> from operator import itemgetter >>> sorted(a, key=itemgetter('id')) [{'name': 'bit', 'id': -2}, {'name': 'ali', 'id': 1}, {'name': 'caven', 'id': 2}]
根据书上的说法,itemgetter效率更高,没有进行比较,有兴趣者可以自行对比。
如果是类呢,也是类似的,要么用lambda表达式选择要进行比较的类属性,或者使用operator的attegetter函数传入要进行比较的值
from operator import attrgetter class User: def __init__(self, id, name): super(User, self).__init__() self.id = id self.name = name def __repr__(self): return '<{},{}>'.format(self.id, self.name) a = [User(1, 'ali'), User(2, 'caven'), User(-2, 'bit')] print(sorted(a, key=lambda x: x.id)) print(sorted(a, key=attrgetter('name')))
[<-2,bit>, <1,ali>, <2,caven>] [<1,ali>, <-2,bit>, <2,caven>]
3.Unicode标准化
直接引用书上例子
>>> s1 = 'Spicy Jalape\u00f1o' >>> s2 = 'Spicy Jalapen\u0303o' >>> s1 'Spicy Jalapeño' >>> s2 'Spicy Jalapeño' >>> s1 == s2 False >>> len(s1) 14 >>> len(s2) 15 >>>以上就是Unicode编码造成的问题
解决方法时在比较前将文本进行标准化处理,用到了unicodedata模块
依然引用书上代码
>>> import unicodedata >>> t1 = unicodedata.normalize('NFC', s1) >>> t2 = unicodedata.normalize('NFC', s2) >>> t1 == t2 True >>> print(ascii(t1)) 'Spicy Jalape\xf1o' >>> t3 = unicodedata.normalize('NFD', s1) >>> t4 = unicodedata.normalize('NFD', s2) >>> t3 == t4 True >>> print(ascii(t3)) 'Spicy Jalapen\u0303o'