python cookbook读书笔记二

    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'



猜你喜欢

转载自blog.csdn.net/tjq980303/article/details/54573989
今日推荐