【2017-09-06】數(shù)據(jù)結(jié)構(gòu)與算法(五)

序列

  • 過濾序列元素
    • 推導(dǎo)式,見上一篇文章,值得注意的是,如果過濾后的結(jié)果很大時(shí),考慮到內(nèi)存的占用,可以使用生成器表達(dá)式。
    • 內(nèi)建的 filter() 函數(shù)使用
    • itertools模塊中compress()函數(shù)的使用
>>> mylist = [1, 4, -5, 10, -7, 2, 3, -1]
>>>#列表推導(dǎo)式
>>> [i for i in mylist if i>0]
[1, 4, 10, 2, 3]
>>>#生成器表達(dá)式
>>> (i for i in mylist if i>0)
<generator object <genexpr> at 0x005745D0>
>>> 

?? 當(dāng)過濾規(guī)則較復(fù)雜,不能簡(jiǎn)單用推導(dǎo)式或者生成器表達(dá)式處理,可以使用內(nèi)建的 filter() 函數(shù)。filter()函數(shù)接收一個(gè)函數(shù) f 和一個(gè)list,這個(gè)函數(shù) f 的作用是對(duì)每個(gè)元素進(jìn)行判斷,返回 True或 False,filter()根據(jù)判斷結(jié)果自動(dòng)過濾掉不符合條件的元素,返回由符合條件元素組成的迭代器。

示例:利用filter()過濾出1~100中平方根是整數(shù)的數(shù)

>>> import math
>>> def isInteger(x):
    return math.sqrt(x) % 1==0
>>> filter(isInteger,range(1,101))
<filter object at 0x02315330>
>>> list(filter(isInteger,range(1,101)))
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

?? itertools模塊compress() 函數(shù)與filter()類似,它以一個(gè) iterable對(duì)象和一個(gè)相對(duì)應(yīng)的 Boolean 序列作為輸入?yún)?shù)。Boolean 序列,指示哪些元素符合條件。然后compress() 函數(shù)根據(jù)這個(gè)序列去iterable對(duì)象中選擇并輸出對(duì)應(yīng)位置為 True 的元素。

>>> from itertools import compress
>>> compress('ABCDEF', [1,0,1,0,1,1])
<itertools.compress object at 0x023157B0>
>>> list(compress('ABCDEF', [1,0,1,0,1,1]))
['A', 'C', 'E', 'F']
>>> #當(dāng) Boolean 選擇器長(zhǎng)度小于iterable對(duì)象長(zhǎng)度時(shí),默認(rèn)false
>>> list(compress('ABCDEF', [1,0,1]))
['A', 'C']
>>> 
  • 通過某個(gè)字段將序列分組
    itertools模塊groupby() 函數(shù)運(yùn)用
    ?? groupby() 函數(shù)掃描整個(gè)序列并且查找連續(xù)相同值 (或者根據(jù)指定 key 函數(shù)返回值相同) 的元素序列。在每次迭代的時(shí)候,它會(huì)返回一個(gè)值和一個(gè)迭代器對(duì)象,這個(gè)迭代器對(duì)象可以生成元素值全部等于上面那個(gè)值的組中所有對(duì)象。
    ?? 由于groupby() 函數(shù)是連續(xù)查找,當(dāng)序列無序時(shí),可能得不到想要的結(jié)果,需要事先進(jìn)行排序

示例1:根據(jù)日期進(jìn)行分組

>>> from operator import itemgetter
>>> from itertools import groupby
>>> rows = [
{'address': '5412 N CLARK', 'date': '07/01/2012'},
{'address': '5148 N CLARK', 'date': '07/04/2012'},
{'address': '5800 E 58TH', 'date': '07/02/2012'},
{'address': '2122 N CLARK', 'date': '07/03/2012'},
{'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'},
{'address': '1060 W ADDISON', 'date': '07/02/2012'},
{'address': '4801 N BROADWAY', 'date': '07/01/2012'},
{'address': '1039 W GRANVILLE', 'date': '07/04/2012'},
]
>>> rows.sort(key=itemgetter('date'))
>>> for date, items in groupby(rows, key=itemgetter('date')):
    print(date)
    for i in items:
        print(' ', i)

        
07/01/2012
  {'date': '07/01/2012', 'address': '5412 N CLARK'}
  {'date': '07/01/2012', 'address': '4801 N BROADWAY'}
07/02/2012
  {'date': '07/02/2012', 'address': '5800 E 58TH'}
  {'date': '07/02/2012', 'address': '5645 N RAVENSWOOD'}
  {'date': '07/02/2012', 'address': '1060 W ADDISON'}
07/03/2012
  {'date': '07/03/2012', 'address': '2122 N CLARK'}
07/04/2012
  {'date': '07/04/2012', 'address': '5148 N CLARK'}
  {'date': '07/04/2012', 'address': '1039 W GRANVILLE'}

>>> 

示例2:根據(jù)身高

>>> people=[192,156,200,185,170,166,160]
>>> def group(x):
    if x>180:
        return "hight"
    if x>170 and x<=180:
        return "middle"
    if x<=170:
        return "short"
>>> people.sort()
>>> people
[156, 160, 166, 170, 185, 192, 200]
>>> for zu, items in groupby(people, key=group):
    print(zu, list(items))

short [156, 160, 166, 170]
hight [185, 192, 200]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容