如何在列表、字典和集合中根據(jù)條件篩選數(shù)據(jù)

實(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}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容