實際案例
在實際開發(fā)過程中,常常遇到如下幾種情況:
- 過濾掉列表[3, 9, -1, 10, 20, -2, ...]中的負數(shù);
- 篩選出字典{‘Jack’:79, 'Jim':88, 'Lucy':92, ...}中值高于90的鍵值對甥啄;
- 篩選出集合{77, 89, 32, 20, ...}中能被3整除的元素。
故應(yīng)學(xué)會在列表炬搭、字典和集合中根據(jù)條件篩選數(shù)據(jù)蜈漓。
1. 列表
通常我們會采用如下代碼進行篩選:
data = [1, 5, -3, -2, 6, 0, 9]
res = []
for x in data:
if x >= 0:
res.append(x)
print res
對此,我們可以使用Python中的filter()宫盔,具體做法如下:
# -*- coding: utf-8 -*-
from random import randint
# 通過randint()隨機生成含有10個int類型元素的list融虽,且其元素范圍為[-10, 10]
data = [randint(-10, 10) for _ in xrange(10)]
print data
# 通過filter()過濾掉負數(shù),并將其最終結(jié)果打印
print filter(lambda x: x >= 0, data)
除此之外灼芭,我們還能使用列表解析過濾掉列表中的負數(shù)有额。
# -*- coding: utf-8 -*-
from random import randint
# 通過randint()隨機生成含有10個int類型元素的list,且其元素范圍為[-10, 10]
data = [randint(-10, 10) for _ in xrange(10)]
print data
# 通過列表解析過濾掉負數(shù)彼绷,并將其最終結(jié)果打印
print [x for x in data if x >= 0]
這時巍佑,我們可能會有一個疑問既然這三種方法都可以成功過濾掉列表中的負數(shù),那哪一種方法效率更高呢苛预?這里句狼,我們可以使用timeit這個計時工具模塊,分別測試三種方法的運行時間热某。其中腻菇,我們不妨將第一種方法命名為CommReNeg(),第二種方法命名為FiltReNeg()昔馋,第三種方法命名為ListReNeg()筹吐,具體代碼如下:
# -*- coding: utf-8 -*-
from random import randint
import timeit
# 通過randint()隨機生成含有10個int類型元素的list,且其元素范圍為[-10, 10]
data = [randint(-10, 10) for _ in xrange(10)]
def CommReNeg():
res = []
for x in data:
if x >= 0:
res.append(x)
print res
def FiltReNeg():
# 通過filter()過濾掉負數(shù)秘遏,并將其最終結(jié)果打印
print filter(lambda x: x >= 0, data)
def ListReNeg():
# 通過列表解析過濾掉負數(shù)丘薛,并將其最終結(jié)果打印
print [x for x in data if x >= 0]
if __name__ == '__main__':
print (timeit.timeit("CommReNeg()", setup="from __main__ import CommReNeg", number=1))
print (timeit.timeit("FiltReNeg()", setup="from __main__ import FiltReNeg", number=1))
print (timeit.timeit("ListReNeg()", setup="from __main__ import ListReNeg", number=1))
其運行結(jié)果如圖所示:
[3, 3, 6, 6, 4]
0.00333480301869
[3, 3, 6, 6, 4]
0.00176789890732
[3, 3, 6, 6, 4]
0.00172641700262
從圖中可以看出第三種方法運行最快,因此推薦使用第三種方法根據(jù)條件篩選數(shù)據(jù)邦危。
2. 字典
既然在列表中已經(jīng)分析出洋侨,采用列表解析運行速度最快舍扰,故在此處采用類似于列表解析的方法過濾掉字典中我們不想要的鍵值對,具體操作如下:
# -*- coding: utf-8 -*-
from random import randint
# 隨機生成含有20個鍵值對的字典
d = {x: randint(60, 100) for x in xrange(1, 21)}
print d
# 通過類似于列表解析的方法過濾掉值小于90的鍵值對
print {k: v for k, v in d.iteritems() if v > 90}
3. 集合
在列表和字典中希坚,都可以采用同一種方式過濾掉我們不想要的值边苹,那么在集合中是否也可以采用呢?答案當然是可以的裁僧,那具體操作如下:
# -*- coding: utf-8 -*-
from random import randint
data = [randint(-10, 10) for _ in xrange(10)]
# 將list轉(zhuǎn)為集合
s = set(data)
print {x for x in s if x%3 == 0}