本文目錄一覽:
Python學習小技巧之列表項的排序
Python學習小技巧之列表項的排序
本文介紹的是關於Python列表項排序的相關內容,分享出來供大家參考學習,下面來看看詳細的介紹:
典型代碼1:
data_list = [6, 9, 1, 3, 0, 10, 100, -100]
data_list.sort()
print(data_list)
輸出1:
[-100, 0, 1, 3, 6, 9, 10, 100]
典型代碼2:
data_list = [6, 9, 1, 3, 0, 10, 100, -100]
data_list_copy = sorted(data_list)
print(data_list)
print(data_list_copy)
輸出2:
[6, 9, 1, 3, 0, 10, 100, -100]
[-100, 0, 1, 3, 6, 9, 10, 100]
應用場景
需要對列表中的項進行排序時使用。其中典型代碼1是使用的列表自身的一個排序方法sort,這個方法自動按照升序排序,並且是原地排序,被排序的列表本身會被修改;典型代碼2是調用的內置函數sort,會產生一個新的經過排序後的列表對象,原列表不受影響。這兩種方式接受的參數幾乎是一樣的,他們都接受一個key參數,這個參數用來指定用對象的哪一部分為排序的依據:
data_list = [(0, 100), (77, 34), (55, 97)]
data_list.sort(key=lambda x: x[1]) # 我們想要基於列表項的第二個數進行排序
print(data_list)
[(77, 34), (55, 97), (0, 100)]
另外一個經常使用的參數是reverse,用來指定是否按照倒序排序,默認為False:
data_list = [(0, 100), (77, 34), (55, 97)]
data_list.sort(key=lambda x: x[1], reverse=True) # 我們想要基於列表項的第二個數進行排序,並倒序
print(data_list)
[(0, 100), (55, 97), (77, 34)]
帶來的好處
1. 內置的排序方法,執行效率高,表達能力強,使代碼更加緊湊,已讀
2. 靈活的參數,用於指定排序的基準,比在類似於Java的語言中需要寫一個comparator要方便很多
其它說明
1. sorted內置函數比列表的sort方法要適用範圍更廣泛,它可以對除列表之外的可迭代數據結構進行排序;
2. list內置的sort方法,屬於原地排序,理論上能夠節省內存的消耗;
總結
好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助
四、 python中的數據類型——列表
列表是一種有序的集合,有點類似c裏面的數組。它的特點是,可以隨時向裏面添加或刪除其中的元素,在python中經常用來存放數據。列表的特點是中括號,內部元素用逗號隔開。
在這個列表中,可以放進去任何元素,不論你的元素是字符串、整型、浮點型、還是布爾值、空值,包括列表什麼的,都可以放進去。
元素與元素之間,用逗號隔開。
列表會為每個元素分配序號,這個序號代表它的位置,稱為索引(index),第一個元素的位置是0,第二個元素是1,以此類推。
使用索引獲取列表中的值時,需要使用中括號來訪問,在中括號前面加上列表名,中括號內部是元素的索引。
0代表第一個元素的位置,1代表第二個,-1代表倒數第一個,-2代表倒數第二個
使用 len() 函數,可以查看列表裏面有多少個元素
在python中,列表的操作是非常的靈活的,我們可以向其中添加或刪除元素。
添加使用 list.append() 函數
list.append() 函數是將元素插入到列表的末尾,當我們想在特定位置插入元素時可以使用 list.insert() 函數
list.insert() 函數接受兩個參數,第一個參數是插入位置,第二個參數是要插入的元素。
需要注意的是,在使用append和insert時,必須在前面註明要操作的列表。就像上面的例子,我們要操作classmates這個列表,所以必須寫成 classmates.append() 或 classmates.insert() ,如果不這麼寫,計算機就不知道你要往哪個列表中加入元素。
沒有特殊情況的話,推薦使用append()函數添加元素,因為使用append的時候,元素默認加在列表尾部,不會造成其他元素索引值的改變。如果使用insert的話,就像上面的insert(1,’Tom’),在位置1插入’Tom’後,Tom後面所有的元素,索引值都加了一個1,列表中元素越多,受影響的程度越大,因此使用append()函數要比insert()函數更快。
刪除列表中元素的方法有三種
del後面需要用索引的方式表明要刪除的元素,也就是上面的例子,names[1]代表names中的第二個元素,使用del即可刪除
list.pop() 函數與del差不多,都是使用索引值進行刪除,只不過寫法不同。
我們可以發現,執行 names.pop(1) 後,python shell打印出了第二個元素的值,也就是我們要刪除的那個值,這是因為 pop() 這個函數,是有返回值的,有時候我們需要使用這個值,這個時候就可以用變量存起來。
這樣我們就可以通過調用a而使用剛才刪掉的元素了。
list.remove() 函數的作用是刪除第一個匹配的元素,上面的例子中,names這個列表裏面,有兩個’Bob’,remove函數只刪除了第一個’Bob’。這就是 list.remove() 函數的特點。
有時候我們想使用列表的前10個元素,或者前n個元素,這時候就應該使用列表的切片。
切片和索引類似,都是使用中括號,區別是,索引中的中括號裏面只有一個數,而切片不同。切片是切割列表,形成切割下來的部分形成新的列表。
切片: list[start:end:[step=1]] ,這就是切片的表達式,要求start和end兩者必須有一個,step不是可以不指定,不指定的時候默認為1。
切片該怎麼理解呢,start就是開始的位置,end就是結束的位置。切片有個特點是「取前不取後」,看上面那個例子可以發現,1作為start,3作為end,1代表第二個元素,3代表第四個元素,列表切片的時候,是不取後面的那個數字對應的元素的,也就是不取第四個元素,所以names[1:3]只取了第二個元素和第三個元素,這就是所謂的取前不取後。
再看下一個例子。
當不指定start或者end的時候,start默認為0,end默認為最後一個元素的索引值+1,因為「取前不取後」,要想取到最後一個元素,必須加個1才行。
上例中,用 len(numbers) 表示了最後一個元素的索引值,因為索引值從0開始,最後一個元素的索引值一定是列表內元素個數-1,根據「取前不取後」,在end位置上的數字應該+1,所以最後就等於 len(numbers) 了。
當不設定start和end的時候,就默認取所有的元素了。
當加入step,這個選項後,step代表步長,默認為1,設定成2的時候,就是隔一個取一個,設定成3時就是隔兩個取一個。
上例中,第一個切片,start和end均未設定,因此從第一個元素開始,隔一個取一個,得到了所有奇數位置的元素。
第二個切片,start設定為了1,因此取了所有偶數位置的元素。
3在列表中,0不在列表中,所以 3 in a 是True,而 0 in a 是False
更多關於列表的信息可以通過使用 help(list) 查看幫助文檔。
eval 的用法,以及python中推導列表的案例
a = [[1,2,3],[2,4,5],[1,2,3]]
for i in range(len(a[0])): 第一種方法
… a[0][i],a[1][i],a[2][i] 此為tuple形式
(1, 2,1)
(2, 4,2)
(3, 5,3)
for i in range(len(a[0])):
… print([a[0][i],a[1][i],a[2][i]]) 注意括號決定了輸出 的形式
[1, 2,1]
[2, 4,2]
[3, 5,3]
eval(“a[0]”)
[1, 2,3]
eval(“a[0][0]”)
1
eval(“a[0][0],a[1][0],a[2][0]”)
(1, 2,1)
a =[[1,2,3],[2,4,5],[1,2,3]] 第二種方法
s = “” 定義一個 為s的字符串
l = [] 定義一個為l 的列表
for i in range(len(a[0])):i大循環是a[][]第二個括號里的值
… for j in range(len(a)):j是a[][]第一個括號里的值
… s += “a[%s][%s],” % (j,i) 輸出的格式把前面的加上
… l.append(s) 三個為一組添加到 l 列表裡
… s = “” s字符串重新置空,開始第二次循環
…
l
第一次循環結果 置空後第二次循環結果
[‘a[0][0],a[1][0],a[2][0],’,’a[0][1],a[1][1],a[2][1],’,’a[0][2],a[1][2],a[2][2],’]
置空後第三次循環結果
[eval(i) for i in l] 循環l里的三個元素 並輸出結果
[(1,2, 1), (2, 4, 2), (3, 5, 3)]
I
原創文章,作者:D0QCT,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/127903.html