如下是Python官方文檔中列表推導(dǎo)式部分的譯文,筆者對(duì)于該部分也是初學(xué),只能從官方文檔學(xué)起了。有不合適的地方還望指正,謝謝。
Python官網(wǎng)列表推導(dǎo)式部分
一 列表推導(dǎo)式
列表推導(dǎo)式提供了一種創(chuàng)建list的簡便方法。應(yīng)用程序創(chuàng)建列表時(shí),列表中的元素來源于其他序列、可迭代對(duì)象或創(chuàng)建的一個(gè)滿足一定條件的序列。
例如,假設(shè)我們要?jiǎng)?chuàng)建一個(gè)平方數(shù)組成的列表,比如:
- squares = []
- for x in range(10):
- squares.append(x**2)
- print(squares)
輸出結(jié)果:
- [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
我們也可以通過下面的方式獲得相同的列表:
- squares = [x**2 for x in range(10)]
這也等價(jià)于下面的方式,但列表推導(dǎo)式的方式更簡單。
- squar = map(lambda x:x**2,range(10))
對(duì)于函數(shù)map(function,iterable),其含有兩個(gè)參數(shù),第一個(gè)參數(shù)function是一個(gè)函數(shù),第二個(gè)參數(shù)是一個(gè)列表。列表中的每一個(gè)元素調(diào)用函數(shù)function,結(jié)果構(gòu)成一個(gè)新的序列。
關(guān)于map()函數(shù)和map對(duì)象,請(qǐng)參考:
關(guān)于lambda,請(qǐng)參考:
列表推導(dǎo)式包含一對(duì)括號(hào),在括號(hào)中有一個(gè)表達(dá)式,表達(dá)式后面緊跟一條for語句,然后是零條或多條,for語句或if語句。通過for語句和if語句計(jì)算出表達(dá)式,結(jié)果作為新列表的元素。例如,下面的列表推導(dǎo)式將兩個(gè)不同列表中的元素整合到了一起:
- >>> [(x,y)for x in [1,2,3] for y in [3,1,4] if x != y]
- [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
這等價(jià)于:
- >>> combs = []
- >>> for x in [1,2,3]:
- for y in [3,1,4]:
- if x != y:
- combs.append((x,y))
-
- >>> combs
- [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
注意:for語句和if語句在這兩段程序片中的順序是相同的。
如果表達(dá)式是一個(gè)元組(例如前面例子中的(x,y)),那么必須得給它加上括號(hào)。
- >>> vec = [-4,-2,0,2,4]
- >>> #用vec中元素的倍數(shù),創(chuàng)建一個(gè)數(shù)組
- >>> [x*2 for x in vec]
- [-8, -4, 0, 4, 8]
- >>> #過濾列表,刪除列表中的負(fù)數(shù)
- >>> [x for x in vec if x >= 0]
- [0, 2, 4]
- >>> #對(duì)列表中的每個(gè)元素應(yīng)用一個(gè)函數(shù)
- >>> [abs(x) for x in vec]
- [4, 2, 0, 2, 4]
- >>> #對(duì)每個(gè)元素調(diào)用一個(gè)方法
- >>> freshfruit = ['000banana00','0000loganberry0','0passion fruit00000']
- >>> [weapon.strip('0') for weapon in freshfruit]#str.strip(ch) : 刪除字符串開頭結(jié)尾處的字符ch
- ['banana', 'loganberry', 'passion fruit']
- >>> #創(chuàng)建一個(gè)2元元組,比如(number,square)
- >>> [(x,x**2) for x in range(6)]
- [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
- >>> #元組必須用括號(hào)包圍,不然就會(huì)出錯(cuò)
- >>> [x,x**2 for x in range(6)]
- SyntaxError: invalid syntax
- >>> #將一個(gè)多維數(shù)組轉(zhuǎn)化為一個(gè)一維數(shù)組
- >>> vec = [[1,2,3],[4,5,6],[7,8,9]]
- >>> [num for elem in vec for num in elem]
- [1, 2, 3, 4, 5, 6, 7, 8, 9]
列表推導(dǎo)式可以包含復(fù)雜表達(dá)式和嵌套函數(shù);
- >>> from math import pi
- >>> [str(round(pi,i)) for i in range(1,6)]
- ['3.1', '3.14', '3.142', '3.1416', '3.14159']
對(duì)于round函數(shù),其本身的執(zhí)行與Python的版本有關(guān)和計(jì)算機(jī)的精度有關(guān),詳情請(qǐng)參考下面的鏈接,此處可簡單理解為取pi的i位有效數(shù)字。
二 嵌套列表推導(dǎo)式
列表推導(dǎo)式中,最基本的表達(dá)式可以是任意表達(dá)式,包括其他列表推導(dǎo)式。
下面的3*4的矩陣,可以當(dāng)做一個(gè)列表list,該列表由3個(gè)長度為4的子列表的組成:
- >>> matrix = [
- [1,2,3,4],
- [5,6,7,8],
- [9,10,11,12],
- ]
- >>> matrix
- [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
使用下面的列表推導(dǎo)式轉(zhuǎn)置行和列:
- >>> [[row_list[j] for row_list in matrix]for j in range(4)]
- [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
從前面的小節(jié)中可以看出,嵌套的列表推導(dǎo)式是在for循環(huán)的body中進(jìn)行計(jì)算的,所以上滿的例子等同于:
- >>> transposed = []
- >>> for j in range(4):
- transposed.append([row[j] for row in matrix])
- >>> transposed
- [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
也等同于:
- >>> transposed
- [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
- >>> transposed = []
- >>> for j in range(4):
- #下面的三行實(shí)現(xiàn)了嵌套列表推導(dǎo)式
- transposed_row = []
- for row_list in matrix:
- transposed_row.append(row_list[j])
- transposed.append(transposed_row)
-
- >>> transposed
- [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
在現(xiàn)實(shí)情況中,與復(fù)雜的流式語句相比,你可能更喜歡Python的內(nèi)置函數(shù)。那么,zip()函數(shù)就更適合與完成上面的工作了。
- >>> zipp = zip(*matrix)
- >>> list(zipp)
- [(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]]
關(guān)于zip()函數(shù), 請(qǐng)參考:
|