[Python] Easy Dictinoary

最近有點忙, 來更新一個簡易的工具, ML 晚點再更新

python 有個很好用的工具 - dictionary, 基本上就是 key, value 的 data structure

使用相當簡單

Code:
sample = {}
sample['a'] = 5
sample['b'] = 3
sample['c'] = 2
print sample

Result:
{'a': 5, 'c': 2, 'b': 3}

同樣的結果也可以這樣給值
sample = {'a': 5, 'c': 2, 'b': 3}

那常見的還有印出所有 keys 或者是印出 dict 所有內容
print sample.keys()  # 可以查出所有的 keys
for k, v in sample.items()  # 可以印出所有 key, value pair
    print k, v

而使用 dictionary 可能常常會去判斷是不是有已經有此 key, 有的話 value +1, 沒有的話 value = 1

寫法常見如下:

Code:
key = 'a'
if key in sample:     # 用 in 就夠簡白了, 還有很多其他方法並沒有比較快
    sample[key] += 1
else:
    sample[key] = 1

因為 dictionary 預設是空值, 所以都要做這樣的設定

Q: 如果今天我們想要有初始值的 dictionary 呢?

A: 其實在 python 的 collections library 有一個 defaultdict 可以預設初始值

Code
from collections import defaultdict
sample = defaultdict(lambda: 0)
key = 'a'
sample[key] += 1

也就是不用多那個 if 判斷, 因為他是偵測如果沒有這個 key, 他會先設定成 0 然後再 +1

Q: 那如果想要紀錄一些資料進出, 結果後來要刪除最舊的資料, 這種帶有 order 的屬性的時候, 要怎麼辦呢?

A: 笨一點或許就在 value 那邊加入時間的內容, 然後要刪除先比對, 有那麼一點不好用

當然最常見的實作是多一個 list 去紀錄 key 進入的順序, 這樣就可以了

不過 collections 還有一個 OrderedDict, 他可以 FIFO or LIFO 的方式去刪除 dict 裡面的資料

而且用法跟原本的幾乎一樣, 只是差在要刪除的時候要下 poptime 跟 last 參數

例如:
Code:
from collections import OrderedDict
sample = OrderedDict()
sample['a'] = 5
sample['b'] = 3
sample['c'] = 2
sample.popitem(last=False)  # 刪除最早輸入的那筆 sample['a'] = 5
print 'Delete first: ', sample
sample.popitem(last=True)  # 刪除最後輸入的那筆 sample['c'] = 2
print 'Delete Last: ', sample

Result:
Delete first: OrderedDict([('b', 3), ('c', 2)])
Delete Last: OrderedDict([('b', 3)])

可以看出來只剩下中間的 item, 當然以上不能用太舊的 python

留言

  1. Casinos in Las Vegas | Dr.MD
    Find the best 화성 출장마사지 casinos near 김천 출장안마 you in Las Vegas, Nevada, USA and find a 구리 출장마사지 bonus 창원 출장샵 code for the best no deposit bonuses at 화성 출장안마 Casino: Borgata Hotel & Casino; MGM Grand Las Vegas

    回覆刪除

張貼留言

這個網誌中的熱門文章

[Linux] Linux下查詢硬體記憶體資訊 Memory Information

[Other] Chrome 重新整理所有開啟頁面

[Python] Simple Socket Server