本文共 1908 字,大约阅读时间需要 6 分钟。
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 attrgetterclass 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 == s2False>>> len(s1)14>>> len(s2)15>>>以上就是Unicode编码造成的问题
解决方法时在比较前将文本进行标准化处理,用到了unicodedata模块
依然引用书上代码
>>> import unicodedata>>> t1 = unicodedata.normalize('NFC', s1)>>> t2 = unicodedata.normalize('NFC', s2)>>> t1 == t2True>>> print(ascii(t1))'Spicy Jalape\xf1o'>>> t3 = unicodedata.normalize('NFD', s1)>>> t4 = unicodedata.normalize('NFD', s2)>>> t3 == t4True>>> print(ascii(t3))'Spicy Jalapen\u0303o'
转载地址:http://wigmi.baihongyu.com/