Python編程思想(16):壓縮與排序列表

李寧老師已經在「極客起源」 微信公衆號推出《Python編程思想》電子書,囊括了Python的核心技術,以及Python的主要函數庫的使用方法。讀者可以在「極客起源」 公衆號中輸入 160442 開始學習。

《Python編程思想》總目錄

《Python編程思想》專欄

示例代碼:func.py

使用zip()函數可以把兩個列表“壓縮”成一個zip對象(可迭代對象),這樣可以使用一個循環並行遍歷兩個列表。爲了測試zip()函數的功能,可以使用下面的代碼:

a=['a','b','c']
b=[1,2,3]
c = [x for x in zip(a, b)]
print(c)

運行這段代碼,會輸出如下的結果:

[('a', 1), ('b', 2), ('c', 3)]

從上面的輸出結果來看,zip()函數壓縮得到的可選代對象所包含的元素是由原列表元素組成的元組。

那麼如果壓縮的兩個列表長度不相等會怎麼樣呢?看下面的例子:

t1 = ['a','b','c']
t2 = [6,8]
c = [x for x in zip(t1, t2)]
print(c)

執行這段代碼,輸出結果如下:

[('a', 6), ('b', 8)]

從上面的輸出結果可以看出,如果zip()函數壓縮的兩個列表長度不相等,那麼zip()函數將以長度更短的列表爲準。

zip()函數不僅可以壓縮兩個列表,也可以壓縮多個列表。如下面的列表壓縮了3個列表:

a=['a','b','c']
b=[1,2,3]
c=[20,40,50]
p = [x for x in zip(a,b,c)]
print(p)

這段代碼的輸出結果如下:

[('a', 1, 20), ('b', 2, 40), ('c', 3, 50)]

從上面代碼可以看出,如果使用zip()函數壓縮N個列表,那麼zip()函數返回的可選代對象的元素就是長度爲N的元組。

下面的代碼演示了使用zip()函數來實現並行遍歷的效果。

books = ['Python從菜鳥到高手', 'Python爬蟲技術:深入理解原理、技術與開發', 'Flutter實戰']
prices = [128, 89, 99]
# 使用zip()函數壓縮兩個列表,從而實現並行遍歷
for book, price in zip(books, prices):
    print(f"{book}的價格是: {price}")

執行這段代碼,會輸出如下的結果:

Python從菜鳥到高手的價格是: 128
Python爬蟲技術:深入理解原理、技術與開發的價格是: 89
Flutter實戰的價格是: 99

在某些場景下,程序需要進行反向遍歷,此時可通過 reversed函數,該函數可接收各種序列(元組、列表、區間等)參數,然後返回一個“反序排列”的迭代器,該函數對參數本身不會產生任何影響。看下面的代碼:

a= range(10)
result = [x for x in reversed(a)]
print(result)

執行這段代碼,會輸出如下的結果:

[9,8,7,6,5,4,3,2,1,0]

從上面代碼可以看出,通過 reversed函數得到了range(10)的反轉序列。但如果再次訪問a,會看到a並沒有發生改變。也就是說,reversed函數只是返回反轉的結果,並不會改變原始數據。

reversed函數同樣也可以對列表和元組進行反轉,代碼如下:

data_list =['a','Python','Java',40, 12.4,51]
data_tuple =('a','Python','Java',40, 12.4,51)

result1 = [x for x in reversed(data_list)]
result2 = [x for x in reversed(data_tuple)]
print(result1)
print(result2)

執行這段代碼啊,會輸出如下的結果:

[51, 12.4, 40, 'Java', 'Python', 'a']
[51, 12.4, 40, 'Java', 'Python', 'a']

從輸出結果可以看出,不管是列表還是元組,reversed函數的返回結果都是列表。

前面的文章提到過,字符串其實也是序列,因此也可通過該函數實現在不影響字符串本身的前提下,對字符串中的字符進行反序遍歷,代碼如下:

s = 'hello, lining'
result = [x for x in reversed(s)]
print(result)

執行這段代碼,會輸出如下的結果:

['g', 'n', 'i', 'n', 'i', 'l', ' ', ',', 'o', 'l', 'l', 'e', 'h']

與 reversed函數類似的還有 sorted函數,該函數接收一個可迭代對象作爲參數,返回一個對元素排序的列表,演示代碼如下:

a=[12,35,-3.2,5.3,91,3.61]
result = sorted (a)
print(result)

執行這段代碼,會輸出如下內容:

[-3.2, 3.61, 5.3, 12, 35, 91]

從上面的輸出結果可以看出, sorted函數也不會改變所傳入的可迭代對象,該函數只是返回一個新的、排序好的列表。

在使用 sorted函數時,還可傳入一個 reverse參數,如果將該參數設置爲True,則表示倒序排列,代碼如下:

例如如下測試過程。

b=[12,35,-3.2,5.3,91,3.61]
result = sorted(b, reverse=True)
print(result)

執行這段代碼的輸出結果如下:

[91, 35, 12, 5.3, 3.61, -3.2]

在調用 sorted函數時,還可傳入一個key參數,該參數可指定一個函數來生成排序的關鍵值,比如希望根據字符串長度排序,則可爲key參數傳入len函數,代碼如下:

c = ['Android', 'ios' 'Mobile', 'Ruby','JavaScript']
result1 = sorted(c, key=len)
result2 = sorted(c, reverse=True,key=len)
print(result1)
print(result2)

這段代碼的輸出結果如下:

['Ruby', 'Android', 'iosMobile', 'JavaScript']
['JavaScript', 'iosMobile', 'Android', 'Ruby']

在這段代碼中,result2使用了reverse參數,讓c列表按字符串長度倒序排列。

對本文感興趣的同學可以加微信unitymarvel,或掃描下面二維碼加羣,然後拖加入技術討論羣。

 

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