您的位置:首页 > 编程语言 > Python开发

python cookbook读书笔记二

2017-01-16 15:37 260 查看
    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'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: