python列表高級(jí)操作——快來(lái)看看你會(huì)多少!
(1)列表生成式(高級(jí)用法)
列表推導(dǎo)式(List Comprehension)是一種簡(jiǎn)化代碼的優(yōu)美方法。官方文檔——**列表推導(dǎo)式提供了一種創(chuàng)建列表的簡(jiǎn)潔方法。**使用列表推導(dǎo)式能夠非常簡(jiǎn)潔的構(gòu)造一個(gè)新列表,只需要用一個(gè)簡(jiǎn)潔的表達(dá)式即可對(duì)得到的元素進(jìn)行轉(zhuǎn)換變形。
使用Python列表推導(dǎo)式的語(yǔ)法格式: variable = [out_exp_res for out_exp in input_list if out_exp == 2] out_exp_res:列表生成元素表達(dá)式,可以是有返回值的函數(shù); for out_exp in input_list:迭代input_list,將out_exp傳入out_exp_res表達(dá)式中; if out_exp == 2:判斷根據(jù)條件可以過(guò)濾哪些值。
第一個(gè):基本使用
慣性思維——常規(guī)方法解決:
list_end = [] for x in range(10): list_end.append(x**2) print(list_end)
借由列表推導(dǎo)式——一行代碼解決:
list_end1 = [x**2 for x in range(10)] print(list_end1)
二者輸出都為:
傳統(tǒng)方法實(shí)現(xiàn):
nums = [] for x in range(30): if x % 3 == 0: nums.append(x) print(nums)
使用列表推導(dǎo)式一行代碼解決:
nums1 = [x for x in range(30) if x % 3 == 0] print(nums1)
二者輸出都為:
第二個(gè):升級(jí)版使用——使用列表生成式的同時(shí)使用函數(shù)處理
需求:首先獲取30以內(nèi)能夠整除3的整數(shù),然后一次輸出所獲得整數(shù)的平方。
def squared(x): return x**2 end = [squared(x) for x in range(30) if x % 3 == 0] print(end)
第三個(gè):高級(jí)版使用——?jiǎng)h選列表中特定元素的高級(jí)操作
在python程序中,有時(shí)候篩選列表中的某些特定元素時(shí),篩選標(biāo)準(zhǔn)無(wú)法簡(jiǎn)單的表示在列表推導(dǎo)式或生成器表達(dá)式中,例如當(dāng)篩選過(guò)程涉及異常處理或者其他一些復(fù)雜的細(xì)節(jié)時(shí)。此時(shí)可以考慮將處理篩選功能的代碼放到單獨(dú)的功能函數(shù)中,然后使用內(nèi)建的filter()函數(shù)進(jìn)行處理。
需求:篩選指定列表中的所有整數(shù)元素!
values = ['1', '2', '-3', '-', '4', 'N/A', '5'] def is_int(val): try: x = int(val) return True except ValueError: return False # 注意:因?yàn)槭褂煤瘮?shù)filter()創(chuàng)建了一個(gè)迭代器,所以想要得到一個(gè)列表形式的結(jié)果,必須在filter()前面加上list()函數(shù)。 isvals = list(filter(is_int, values)) print(isvals)
(2)刪除列表中的重復(fù)元素并保持順序不變
第一個(gè)版本:
需求:刪除列表中重復(fù)出現(xiàn)的元素,并且保持剩下元素的顯示順序不變。如果序列中保存的元素是可散列的(hashable),那么此功能可以使用集合和生成器實(shí)現(xiàn)。
知識(shí)點(diǎn)補(bǔ)給站: 如果一個(gè)對(duì)象是可散列的,那么在它的生存期內(nèi)必須是不可變的,這需要有一個(gè)__hash__()方法。在python程序中, 整數(shù),浮點(diǎn)數(shù),字符串和元組都是不可變的。
上代碼:
def fun(items): seen = set() for item in items: if item not in seen: yield item seen.add(item) if __name__ == '__main__': a = [5, 3, 3, 8, 6, 5, 9] print(a) print(list(fun(a)))
第二個(gè)版本:
上述代碼有個(gè)缺陷——只有當(dāng)序列中的元素是可散列的時(shí)候才能實(shí)現(xiàn)功能。如果想在不可散列的對(duì)象序列中實(shí)現(xiàn)此功能,該如何實(shí)現(xiàn)呢?
上代碼:
def fun(items, key=None): seen = set() for item in items: val = item if key is None else key(item) if val not in seen: yield item seen.add(val) if __name__ == '__main__': a = [ {'x' :2, 'y':3}, {'x' :1, 'y':4}, {'x' :2, 'y':3}, {'x' :2, 'y':3}, {'x' :10, 'y':15} ] print(a) print(list(fun(a, key=lambda a: (a['x'], a['y']))))
注意:上述代碼中函數(shù)fun()中的參數(shù)key的功能是將序列中的元素轉(zhuǎn)換為可散列的類型,這樣做的目的是檢測(cè)重復(fù)選項(xiàng)。
5G教育 Python 數(shù)據(jù)結(jié)構(gòu)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。