effective python讀書筆記——列表的推導(dǎo)式
列表推導(dǎo)式來代替map函數(shù)來在原來列表基礎(chǔ)上構(gòu)造新列表更加簡潔:
a=[1,2,2,2,3,4,5]
#運(yùn)用map函數(shù)構(gòu)造列表
map_method=list(map(lambda x:x**2,a))
#列表推導(dǎo)法
list_method=[x**2 for x in a]
#列表推導(dǎo)法可過濾原列表
even_number_list=[x**2 for x in a if x%2==0]#只要偶數(shù)
#map函數(shù)也可以通過filter方法來實(shí)現(xiàn),略難
map_even_number=list(map(lambda x:x**2,filter(lambda x:x%2==0,a)))
#字典推導(dǎo)
dictionary_method={x:x**2 for x in a if x%2==0}#{:}
#集合推導(dǎo)
set_method={x**2 for x in a if x%2==0}#{}
#而用map方法來實(shí)現(xiàn),就更加復(fù)雜了
map_dictionary=dict(map(lambda x:(x,x**2),filter(lambda x:x%2==0,a)))
map_set=set(map(lambda x:(x,x**2),filter(lambda x:x%2==0,a)))
print(f'map_method :{map_method}')
print(f'list_method :{list_method}')
print(f'even_number_list :{even_number_list}')
print(f'map_even_number :{map_even_number}')
print(f'dictionary_method :{dictionary_method}')
print(f'set_method :{set_method}')#集合中的元素是無序的,同樣的元素只出現(xiàn)一次
print(f'map_set :{map_set}')
print(f'map_dictionary :{map_dictionary}')

關(guān)于表達(dá)式的嵌套:
matrix=[[1,2,3],[4,5,6],[7,8,9]]#一個(gè)矩陣
#用列表表達(dá)式轉(zhuǎn)化成列表
turn_to_list=[x for row in matrix for x in row]
#也可以對(duì)原二維矩陣進(jìn)行數(shù)值轉(zhuǎn)化
square_list=[[x**2 for x in row ] for row in matrix]#對(duì)每個(gè)數(shù)進(jìn)行平方
#但如果是三維矩陣的話,用此方法就顯得比較復(fù)雜
matrix_3=[[[1,2],[3,4]],[[5,6],[7,8]]]
turn_to_list3=[x for sublist1 in matrix_3 for sublist2 in sublist1 for x in sublist2]
#用正常的for循環(huán)就比較清晰
for_method=[]
for sublist1 in matrix_3:
? ? for sublist2 in sublist1:
? ? ? ? for_method.extend(sublist2)
? ? ? ? '''
? ? ? ? for i in sublist2:
? ? ? ? ? ? for_method.append(i)
? ? ? ? '''
print(f'turn_to_list :{turn_to_list}')
print(f'square_list :{square_list}')
print(f'turn_to_list3 :{turn_to_list3}')
print(f'for_method :{for_method}')

關(guān)于if條件的使用:
#同一層循環(huán)內(nèi)的if語句默認(rèn)為and關(guān)系
a=[1,2,3,4,5]
b=[x for x in a if x<4 if x%2!=0]
c=[x for x in a if x<4 and x%2!=0]
#b,c兩寫法等價(jià)
print(f'b : ')
print(f'c : {c}')
#每一層的子表達(dá)式也都可以有if條件
matrix=[[1,2,3],[4,5,6],[7,8,9]]
#篩選出各行元素和大于10的,并只保留整除3的項(xiàng)
selected=[[x for x in row if x%3==0]\
? ? ? ? for row in matrix if sum(row)>10]
print(f'selected :{selected}')
