161.jpg
概述
列表解析即利用現有的可迭代對象創(chuàng)建新的列表的Python語法,其過程完全可以用for循環(huán)復刻捆昏,但其解析效率比for循環(huán)快一些赚楚,缺點也很明顯,即不適合用于大數據迭代對象的解析骗卜,因為會占用大量內存宠页,導致MemoryError左胞。當然列表解析讓人愛不釋手的另一個原因就是簡潔。
列表解析基礎示例
解析列表
L = [1, 2, 3, 4, 5]
LL = [x ** 2 for x in L]
[print(x) for x in LL]
示例結果:
1
4
9
16
25
示例中我們完成了對原列表元素每個值進行平方的操作举户,每個元素的平方結果構成了新的列表
解析字典
D = {
'one': 1,
'two': 2,
'three': 3,
'four': 4,
'five': 5
}
L = [D[key] ** 2 for key in D]
[print(x) for x in L]
1
4
9
16
25
示例中我們利用列表解析獲取字典的鍵值并對每個鍵值進行平方的操作烤宙,而每個鍵值的平方結果構成了新的列表
解析字符串
S = '12345'
L = [int(s) ** 2 for s in S]
[print(x) for x in L]
示例結果
1
4
9
16
25
示例中我們利用列表解析獲取字符串中單個字符串并且轉為整型并進行平方和的操作,而每個平方后的結果構成了新的列表
解析文件
with open('ex.txt') as f:
lines = f.readlines()
LINES = [line.strip().title() for line in lines]
[print(line) for line in LINES]
i like python.
python makes me happy.
without python, without live.
示例中我們甚至可以利用列表解析讀取文件中的數據
表達式
列表解析中的表達式(expr)可以是簡單的或者復雜的表達式俭嘁,甚至是函數躺枕,若在前面的例子中我們利用列表解析逐一打印了列表中的數據。
def is_even(x):
if x >= 0 and x % 2:
return x, True
else:
return x, False
L = [1, 2, 3, 4, 5]
L_EVEN = [is_even(x) for x in L]
print(L_EVEN)
示例結果
[(1, True), (2, False), (3, True), (4, False), (5, True)]
條件列表解析
在列表解析中我們也可以直接加入條件限制解析出的元素
L = [1, 2, 3, 4, 5]
L_EVEN = [x for x in L if x >= 0 and x % 2]
[print(EVEN) for EVEN in L_EVEN]
示例結果:
1
3
5
多值列表解析
列表解析也支持對迭代對象的多值解析
D = {
'one': 1,
'two': 2,
'three': 3,
'four': 4,
'five': 5
}
L = ['{} = {}'.format(key, value) for (key, value) in D.items()]
[print(x) for x in L]
示例結果
one = 1
two = 2
three = 3
four = 4
five = 5
嵌套循環(huán)
列表解析可以進行嵌套循環(huán)供填,原理和for中的嵌套循環(huán)一致
L1 = ['a', 'b', 'c']
L2 = ['1', '2', '3']
L = [x+y for x in L1 for y in L2]
[print(x) for x in L]
示例結果
a1
a2
a3
b1
b2
b3
c1
c2
c3