list.sort方法和內置函數sorted的異同
list.sort方法和sorted函數都是對列表進行排序的,但是這兩種方法也是有少許不同的,list.sort排序是在原有基礎上進行的,不會生成返回一個新的list, 但是sorted函數則不同,他會產生一個新對象並返回。如下
t = [1, 3, 4, 2, 5, 0]
t1 = [1, 3, 4, 2, 5, 0]
print(t.sort())
print(t)
print(sorted(t1))
print(t1)
在同時對t和t1 排序並打印結果,t.sort()返回None sorted(t1) 返回排序好的list,兩者都正確,但是只有t的內容發生改變,t1的內容沒有改變。
sorted()函數要比list.sort()強大很多,sorted()不僅僅只能將list作為參數傳遞進去,還可以接收任何形式的可迭代對象作為參數,甚至是不可變序列或者生成器,不管是接收的什么參數sorted()都是返回一個列表。
list.sort()和sorted()都有兩個可選的參數:
1. reverse:決定是升序還是降序排列,True為降序,默認值為False
2. key: 一個只有一個參數的函數,這個函數會被用在序列的每一個元素上,通俗來講就是排序規則,例如對字符串排序的時候可以使用key=str.lower來實現忽略大小的排序,或者是key=len來按照字符串長度排序等等。默認用元素自己的值來排序。
想要在不打亂次序的情況下如何向有序列表中插入數據呢?
可借助bisect模塊來實現,bisect模塊主要包含兩個函數 ,bisect和insort ,這兩個函數都是利用二分查找算法來實現在有序序列中查找或者插入元素的
例如使用bisect來搜索可插入的位置:
import bisect
t = [123, 3, 234, 1, 423, 5, 25, 235, 325]
t.sort()
print(bisect.bisect(t, 235))
### 7
返回值為可插入的位置。前提是傳入的參數是有序序列,bisect還有兩個可選的參數 lo和 hi即搜索范圍,lo默認為0,hi默認為序列長度。
如果有序序列中已存在要插入的元素的時候,又是如何處理的呢!這個就有兩種情況,插入到原有元素之前或者之后,分別對應兩個方法bisect_left和 bisect_right,而我們之前使用的bisect其實就是bisect_right方法。既然獲取的插入位置,那么使用list.insert方法插入即可完成向有序序列插入元素。有沒有更簡單的方法呢,答案是肯定的,那就是我們之前提到的insort方法。
使用insort插入元素:
import bisect
t = [123, 3, 234, 1, 423, 5, 25, 235, 325]
t.sort()
bisect.insort(t, 222)
print(t)
### [1, 3, 5, 25, 123, 222, 234, 235, 325, 423]
看了bisect源碼之后發現其實insort方法和bisect方法是一樣的,只是獲取到了插入位置之后緊接着調用insert()方法
insort方法和bisect方法是一樣的也是有兩個可選參數lo和hi來縮小范圍,也分insort_left和insort_right,默認使用的是insort_right方法