如何在列表,字典,集合中根據條件刷選數據
說明:
本文分析的類型:
- 列表
- 字典
- 集合
結合每種類型篩選數據的方法的不同,區分出方法間的差異。
一、列表案例
需求:過濾掉列表中的負數。
li = [1,5,-3,-1,0,9,-10,10]
1、通用方法:迭代列表獲取列表中的每個元素進行選擇
代碼:
li = [1, 5, -3, -1, 0, 9, -10, 10] ret = [] for i in li: if i >= 0: ret.append(i) print(ret)
2、filter函數
語法:filter(lambda x: x >= 0, data)

li = [1, 5, -3, -1, 0, 9, -10, 10] new_li = [] ret = filter(lambda x: x >= 0, li) print(ret) for i in ret: new_li.append(i) print(new_li)
結果:
<filter object at 0x0178A4B0> [1, 5, 0, 9, 10]
說明:
filter直接返回的結果是一個課迭代對象。要想獲取其中的數據要對filter結果進行遍歷。
上面的代碼也可以簡寫:

li = [1, 5, -3, -1, 0, 9, -10, 10] new_li = [] ret = [x for x in filter(lambda x: x >= 0, li)] print(ret)
3、列表解析
說明:
列表解析,直接在”[ ]”中操作,將判斷條件寫在了列表解析中。
問題:既然都能得出結果,那filter和列表解析那個好那?
我們可以通過測試兩段代碼執行的時間。

import timeit li = [1, 5, -3, -1, 0, 9, -10, 10] t1 = timeit.Timer('[x for x in filter(lambda x: x >= 0, %s)]' % li) t2 = timeit.Timer('[x for x in %s if x >= 0]' % li) print(t1.timeit()) print(t2.timeit())
結果:
1.9449847999118903 0.865514452222458
說明:
1、結果可以明顯看出,列表解析所用的時間是filter的時間的一半左右,即,列表解析最快,所以推薦使用列表解析。
2、這2中方式都是遠快於使用 for 這種迭代方式的。
二、字典案例
需求:篩選出value值高於90的項。
dic = {‘haha’:79, ‘heihei’:88, ‘hehe’:95, ‘xxx’:100}
1、普通方法
dic = {'haha': 79, 'heihei': 88, 'hehe': 95, 'xxx': 100} new_dic = {} for k,v in dic.items(): if v >= 90: new_dic[k] = v print(new_dic)
結果:
{'hehe': 95, 'xxx': 100}
2、字典解析

dic = {'haha': 79, 'heihei': 88, 'hehe': 95, 'xxx': 100} ret = {k: v for k, v in dic.items() if v >= 90} print(ret)
說明:
字典解析運行時間遠快於普通方法。
三、集合案例
需求:篩選出集合中能被3整除的元素。
s = {77,88,99,6,15,20}
1、普通方法
s = {77, 88, 99, 6, 15, 20} new_s = set() for i in s: if i % 3 == 0: new_s.add(i) print(new_s)
結果:
{99, 6, 15}
2、集合解析

s = {77, 88, 99, 6, 15, 20} ret = {x for x in s if x % 3 == 0} print(ret)
說明:
集合解析也是遠快於普通for循環的。