實(shí)際案例
在實(shí)際開(kāi)發(fā)過(guò)程中,常常遇到如下幾種情況:
- 過(guò)濾掉列表[3, 9, -1, 10, 20, -2, ...]中的負(fù)數(shù);
- 篩選出字典{‘Jack’:79, 'Jim':88, 'Lucy':92, ...}中值高于90的鍵值對(duì);
- 篩選出集合{77, 89, 32, 20, ...}中能被3整除的元素。
故應(yīng)學(xué)會(huì)在列表、字典和集合中根據(jù)條件篩選數(shù)據(jù)。
1. 列表
通常我們會(huì)采用如下代碼進(jìn)行篩選:
data = [1, 5, -3, -2, 6, 0, 9]
res = []
for x in data:
if x >= 0:
res.append(x)
print res
對(duì)此,我們可以使用Python中的filter(),具體做法如下:
# -*- coding: utf-8 -*-
from random import randint
# 通過(guò)randint()隨機(jī)生成含有10個(gè)int類型元素的list,且其元素范圍為[-10, 10]
data = [randint(-10, 10) for _ in xrange(10)]
print data
# 通過(guò)filter()過(guò)濾掉負(fù)數(shù),并將其最終結(jié)果打印
print filter(lambda x: x >= 0, data)
除此之外,我們還能使用列表解析過(guò)濾掉列表中的負(fù)數(shù)。
# -*- coding: utf-8 -*-
from random import randint
# 通過(guò)randint()隨機(jī)生成含有10個(gè)int類型元素的list,且其元素范圍為[-10, 10]
data = [randint(-10, 10) for _ in xrange(10)]
print data
# 通過(guò)列表解析過(guò)濾掉負(fù)數(shù),并將其最終結(jié)果打印
print [x for x in data if x >= 0]
這時(shí),我們可能會(huì)有一個(gè)疑問(wèn)既然這三種方法都可以成功過(guò)濾掉列表中的負(fù)數(shù),那哪一種方法效率更高呢?這里,我們可以使用timeit這個(gè)計(jì)時(shí)工具模塊,分別測(cè)試三種方法的運(yùn)行時(shí)間。其中,我們不妨將第一種方法命名為CommReNeg(),第二種方法命名為FiltReNeg(),第三種方法命名為L(zhǎng)istReNeg(),具體代碼如下:
# -*- coding: utf-8 -*-
from random import randint
import timeit
# 通過(guò)randint()隨機(jī)生成含有10個(gè)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():
# 通過(guò)filter()過(guò)濾掉負(fù)數(shù),并將其最終結(jié)果打印
print filter(lambda x: x >= 0, data)
def ListReNeg():
# 通過(guò)列表解析過(guò)濾掉負(fù)數(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))
其運(yùn)行結(jié)果如圖所示:
[3, 3, 6, 6, 4]
0.00333480301869
[3, 3, 6, 6, 4]
0.00176789890732
[3, 3, 6, 6, 4]
0.00172641700262
從圖中可以看出第三種方法運(yùn)行最快,因此推薦使用第三種方法根據(jù)條件篩選數(shù)據(jù)。
2. 字典
既然在列表中已經(jīng)分析出,采用列表解析運(yùn)行速度最快,故在此處采用類似于列表解析的方法過(guò)濾掉字典中我們不想要的鍵值對(duì),具體操作如下:
# -*- coding: utf-8 -*-
from random import randint
# 隨機(jī)生成含有20個(gè)鍵值對(duì)的字典
d = {x: randint(60, 100) for x in xrange(1, 21)}
print d
# 通過(guò)類似于列表解析的方法過(guò)濾掉值小于90的鍵值對(duì)
print {k: v for k, v in d.iteritems() if v > 90}
3. 集合
在列表和字典中,都可以采用同一種方式過(guò)濾掉我們不想要的值,那么在集合中是否也可以采用呢?答案當(dāng)然是可以的,那具體操作如下:
# -*- 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}