python三大類型數據篩選


如何在列表,字典,集合中根據條件刷選數據

說明:

本文分析的類型:

  • 列表
  • 字典
  • 集合

結合每種類型篩選數據的方法的不同,區分出方法間的差異。

一、列表案例

需求:過濾掉列表中的負數。

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

結果:

<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、列表解析

li = [1, 5, -3, -1, 0, 9, -10, 10]

ret = [x for x in li if x >= 0]
print(ret)
列表解析

說明:

列表解析,直接在”[ ]”中操作,將判斷條件寫在了列表解析中。

問題:既然都能得出結果,那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循環的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM