python進(jìn)階-內(nèi)部數(shù)據(jù)結(jié)構(gòu)和算法

本文內(nèi)容整理自《Python Cookbook》,僅用作本人學(xué)習(xí)筆記,若侵犯原著權(quán)益請盡快聯(lián)系本人。


1.將序列分解為單獨(dú)變量

  • 理解多重賦值
  • 丟棄元素方法
data = ('Kevin', 50, 100, (2017, 2, 28))
name, shares, _, date = data

# _ 變量理解為忽略該位置元素

2.從任意長度的可迭代對象中分離元素

  • 理解*args為取序列
record = ('Kevin', 50, 100, (2017, 2, 28))
name, *_,(*_,year) = record

# *args會(huì)貪婪的獲取元祖成員

3.保存最后N個(gè)元素

  • 掌握collections.deque用法
  • deque從兩端增刪元素復(fù)雜度為O(1),普通列表從頭部刪除元素復(fù)雜度為O(N)
from collections import deque
q = deque(maxlen=5)
q.append((1,2))
q.append(4)
q.appendleft(3)
print(q)
q.pop()
q.popleft()
print(q)
##print
# deque([3, (1, 2), 4], maxlen=5)
# deque([(1, 2)], maxlen=5)

4.找到最大或最小的N個(gè)元素

  • 熟悉堆模塊heapq
  • heapq.nlargest(n, list, key)
  • heapq.nsmallest(n, list, key) #key為可自定義函數(shù)
  • heapq.heapify(list) #堆化,當(dāng)list數(shù)目較小時(shí)比上面快
  • max(),min()在取單個(gè)元素時(shí)較快
  • 若待取元素?cái)?shù)量接近于列表大小,則先排序再切片性能最好(nlargest和nsmallest也會(huì)自動(dòng)判斷這個(gè)問題)

5.實(shí)現(xiàn)優(yōu)先級隊(duì)列

  • heapq.heappush(list,item)
  • heapq.heappop(list)
  • 注意默認(rèn)生成的堆是以優(yōu)先級小到大的順序排序的
import heapq

class priorityList(object):
    def __init__(self):
        self._queue = []
        self._index = 0

    def push(self,item,priority):
        heapq.heappush(self._queue, (-priority, self._index, item))
        self._index += 1

    def pop(self):
        return heapq.heappop(self._queue)[-1]

if __name__ == '__main__':
    q = priorityList()
    q.push(5,2)
    q.push(3,1)
    q.push(7,1)
    print(q.pop())
    print(q._queue)

6.生成一對多字典

  • collections.defaultdict(type)會(huì)默認(rèn)初始化字典key對應(yīng)的值為“空”
from collections import defaultdict

d = defaultdict(list)
for key, value in pairs:
    d[key].append(value)

7.讓字典保持有序

  • collections.OrderedDict()
from collections import OrderedDict
d = OrderedDict()
##然后當(dāng)字典用

8.與字典有關(guān)的計(jì)算問題

  • zip(list1,list2)生成一個(gè)迭代器內(nèi)容為list1與list2組合成的元組
min(zip(d.values(), d.keys()))
max(zip(d.values(), d.keys()))

9.兩個(gè)字典的相同點(diǎn)

  • dict.keys()返回keys-view對象
  • dict.items()返回item-view對象
  • 以上的對象可以進(jìn)行集合操作 交集 |,差集 -,并集 &
a = {'a':1,'b':2}
c = {key:a[key] for key in a.keys() - ('b')}
# 字典解析

10.序列去重并順序不變

  • set()集合
  • yield
  • lambda
def depute(items, key=None):
    s = set()
    for item in items:
        val = item if key == None else key(item)
        if val not in s:
            yield item
            s.add(val)

c = [{'x':1,'y':2},{'x':1, 'y':3},{'x':2, 'y':3}]
print(list(depute(c, lambda d:(d['x']))))

11.對切片命名

  • slice()可用于切片操作
PRICE = slice(2,4)
record = 'AA123456567899'
cost = int(record[PRICE]) * 2

12.找出序列中出現(xiàn)次數(shù)最多的元素

  • collections.Counter()
words = ['i','am','i']
word_counts = Counter(words)
print(word_counts.most_common(3))
word_counts['i'] += 1
morewords = ['i','was']
word_counts.update(morewords)

13.通過公共鍵堆字典列表排序

  • operator.itemgetter
from operator import itemgetter
sorted(d, key=itemgetter('lname'))

14.對不原生支持比較的對象排序

  • sort的key參數(shù)
  • lambda
  • operator.attrgetter()

15.根據(jù)字段將字典列表分組

  • itertools.groupby() and sort()
  • collections.defaultdict()
from operator import itemgetter
from itertools import groupby

rows.sort(key=itemgetter('date'))
for date, items in groupby(rows, key=itemgetter('date')):
    for i in items:
        print(i)

16.篩選序列的元素

  • 列表推導(dǎo)式[ n if n>10 else 0 for n in xrange(20)]
  • 生成器表達(dá)式(n if n>10 else 0 for n in xrange(20))
  • filter(function, list)
  • itertools.compress(可迭代對象, 布爾序列)

17.從字典中提取子集

  • 字典推導(dǎo)式{key:value for key,value in prices.items() if value > 200}

18.將名稱映射到序列的元素中

  • collections.namedtuple()命名元組
from collections import namedtuple

Subscribe = namedtuple('Subscribe',['addr', 'joined'])
sub = Subscribe('openex@qq.com','2016/1/1')
sub = sub._replace(joined=2) 
print(sub.addr)
print(sub.joined)

19.同時(shí)對數(shù)據(jù)做轉(zhuǎn)換和換算

  • 在函數(shù)參數(shù)中使用生成器表達(dá)式(函數(shù)指sum(),min()等可傳入迭代元素函數(shù))
  • 注意max(生成器表達(dá)式) 比 max( [生成器表達(dá)式] ) 省內(nèi)存
d= [{'name':'kevin', 'price':1},{'name':"openex", 'price':2}]
print(max(s['price'] * 2 for s in d))
###輸出: 4
print(max(d, key=lambda s:s['price'] * -1) )
###輸出: {'name': 'kevin', 'price': 1}

20.將多個(gè)字典映射為一個(gè)字典

  • collections.ChainMap(*maps)
  • map.update(map)
  • ChainMap,在修改和查詢時(shí)默認(rèn)操作第一個(gè)字典
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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