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'



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章