python實(shí)用小技之?dāng)?shù)據(jù)結(jié)構(gòu)

本文大多數(shù)例子搬自 python cookbook 這里是對學(xué)習(xí)的一個總結(jié)和提煉

ps:python版本為python3

1.解壓序列賦值給多個變量

# 有一個包含 N 個元素的元組或者是序列,怎樣將它里面的值解壓后同時賦值給 N 個變量?

data = ['ACME', 50, 91.1, (2012, 12, 21)]

# 任何的序列(或者是可迭代對象)可以通過一個簡單的賦值語句解壓并賦值給多個變量

# 變量的數(shù)量必須跟序列元素的數(shù)量是一樣的

name, shares, prices, date = data

print(name, shares, prices, date, sep=" | ", end="\n")

# 如果只需要一部分,可以給個占位變量如

_, sha, pr, _ = data

print(sha,pr,sep=' | ')

運(yùn)行結(jié)果:

ACME | 50 | 91.1 | (2012, 12, 21)

50 | 91.1

2.解壓可迭代對象賦值給多個變量

# 解壓可迭代對象賦值給多個變量

def drop_frist_last(grades):

? ? frist, *middle, last = grades

? ? return sum(middle) / len(middle)

print(drop_frist_last([0, 60, 70, 80, 100]))

# 有時候,你想解壓一些元素后丟棄它們,可以使用 比如 _ 或者 ign

record = ('ACME', 50, 123.45, (12, 18, 2012))

name,*_,(*_,year) = record

print(name,year)

運(yùn)行結(jié)果:

70.0

ACME 2012

3.保留有限的歷史記錄

'''

使用 deque(maxlen=N) 構(gòu)造函數(shù)會新建一個固定大小的隊(duì)列。當(dāng)新的元素加入并且這個隊(duì)列已滿的時候, 最老的元素會自動被移除掉

'''

def search(lines, pattern, histroy=60):

? ? previous_lines = deque(maxlen=histroy)

? ? for line in lines:

? ? ? ? if pattern in line:

? ? ? ? ? ? yield line, previous_lines

? ? ? ? ? ? previous_lines.append(line)

? ? ? ? ? ? print(len(previous_lines))

? ? ? ? ? ? for item in previous_lines:

? ? ? ? ? ? ? ? print(item)

if __name__ == "__main__":

? ? with open(os.getcwd() + "/Lesson1.py") as f:

? ? ? ? for line, prevlines in search(f, '50', 3):

? ? ? ? ? ? print("type prevlines =", type(prevlines))

? ? ? ? ? ? for pline in prevlines:

? ? ? ? ? ? ? ? print('pline = ', pline, end='')

? ? ? ? ? ? print("type line =", type(line))

? ? ? ? ? ? # print('line = ', line, end='')

? ? ? ? ? ? print('-' * 20)

#? ? ? ? ? ?

4.怎樣從一個集合中獲得最大或者最小的 N 個元素列表?

# 當(dāng)集合是一個列表是

nums = [3, 10, 5, 23, 7, -4, 18, 23, 42, 37, 2]

print(heapq.nlargest(3, nums))

print(heapq.nsmallest(3, nums))

# 如果是更負(fù)責(zé)的對象時候

mydirt = [

? ? {'name': 'IBM', 'shares': 100, 'price': 91.1},

? ? {'name': 'AAPL', 'shares': 50, 'price': 543.22},

? ? {'name': 'FB', 'shares': 200, 'price': 21.09},

? ? {'name': 'HPQ', 'shares': 35, 'price': 31.75}]

print(heapq.nlargest(2, mydirt, key=lambda l: l['price']))

print(heapq.nsmallest(2, mydirt, key=lambda l: l['price']))

運(yùn)行結(jié)果

[42, 37, 23]

[-4, 2, 3]

[{'name': 'AAPL', 'shares': 50, 'price': 543.22}, {'name': 'IBM', 'shares': 100, 'price': 91.1}]

[{'name': 'FB', 'shares': 200, 'price': 21.09}, {'name': 'HPQ', 'shares': 35, 'price': 31.75}]

ps:堆數(shù)據(jù)結(jié)構(gòu)最重要的特征是 heap[0] 永遠(yuǎn)是最小的元素,另外 nlargest,nsmallest 適合查找的元素個數(shù)相對比較小的時候,如果你僅僅想查找唯一的最小或最大(N=1)的元素的話,那么使用 min() 和 max() 函數(shù)會更快些。 類似的,如果 N 的大小和集合大小接近的時候,通常先排序這個集合然后再使用切片操作會更快點(diǎn) ( sorted(items)[:N] 或者是 sorted(items)[-N:] )

5.字典排序

'''

你想創(chuàng)建一個字典,并且在迭代或序列化這個字典的時候能夠控制元素的順序。

'''

from collections import OrderedDict

d = OrderedDict()

d['foo'] = 1

d['beer'] = 2

d['bar'] = 4

d['park'] = 3

for key in d:

? ? print(key, d[key])

執(zhí)行結(jié)果:

foo 1

beer 2

bar 4

park 3

6.字典中的鍵映射多個值

from collections import defaultdict

df_d = defaultdict(list)

df_d['a'].append(1)

df_d['a'].append(2)

df_d['b'].append(4)

print(df_d)

d2 = defaultdict(set)

pairs = [('a', 1), ('a', 2), ('b', 4)]

for key, value in pairs:

? ? d2[key].add(value)

print(d2)

運(yùn)行結(jié)果:

defaultdict(<class 'list'>, {'a': [1, 2], 'b': [4]})

defaultdict(<class 'set'>, {'a': {1, 2}, 'b': {4}})

7.字典的運(yùn)算(求最小值、最大值、排序等)

prices = {

? ? 'ACME': 45.23,

? ? 'AAPL': 612.78,

? ? 'IBM': 205.55,

? ? 'HPQ': 37.20,

? ? 'FB': 10.75

}

# 求最小值

# 方法 1,通過zip 函數(shù)創(chuàng)建的是一個只能訪問一次的迭代,將鍵值反過來

print(min(zip(prices.values(), prices.keys())))

# 輸出 (10.75, 'FB')

# 方法二 直接取values 獲取最小值,不過你就不知道對于的key

print(min(prices.values()))

# 輸出 10.75

# 方法三

min_key = min(prices, key=lambda k: prices[k])

print(prices[min_key])

# 輸出 FB

# 排序

prices_sorted = sorted(zip(prices.values(), prices.keys()))

print(prices_sorted)

# 輸出 [(10.75, 'FB'), (37.2, 'HPQ'), (45.23, 'ACME'), (205.55, 'IBM'), (612.78, 'AAPL')]

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

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

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