ã¯ããã«
ããã«ã¡ã¯ãååã®80代ç®åå«å
¼ASé¨DS2課ã®åã§ããcollectionsã©ã¤ãã©ãªãæ´»ç¨ããã第ï¼å¼¾ï¼ä»åã¯OrderedDictã®ç´¹ä»ã§ãã
ååã®è¨äºã§ãcollectionsã©ã¤ãã©ãªã¯ãæ±ç¨ã® Python çµã¿è¾¼ã¿ã³ã³ãã dict, list, set, ããã³ tuple ã«ä»£ãããç¹æ®ãªã³ã³ãããã¼ã¿åã®å®è£
ãã¨ã®ã話ãããã¾ããã
第ï¼å¼¾ã¯tupleãæ¡å¼µããnamedtupleã®ç´¹ä»ã§ããããä»åã¯dictãæ¡å¼µããOrderedDictã§ããããã§ã¯æ©éã¿ã¦ã¿ã¾ãããï¼
OrderedDict: é åºä»ãè¾æ¸å
OrderedDictã¯ååéãããé åºä»ãè¾æ¸ãã«ãªãã¾ããã¾ãã¯ã©ã®ããã«ä½¿ãã®ããã¿ã¦ã¿ã¾ãããã
from collections import OrderedDict ã # listãæ¸¡ãã¦ä½æ od = OrderedDict([ ('key_1', 'itme_1'), ('key_2', 'itme_2'), ('key_3', 'itme_3'), ]) od # OrderedDict([('key_1', 'itme_1'), ('key_2', 'itme_2'), ('key_3', 'itme_3')]) ã # tupleãæ¸¡ãã¦ä½æ od = OrderedDict( key_1='item_1', key_2='item_2', key_3='item_3', ) od # OrderedDict([('key_1', 'item_1'), ('key_2', 'item_2'), ('key_3', 'item_3')]) ã # è¦ç´ ãæä½ããæ¹æ³ã¯dictåæ§ od['new_key'] = 'new_item' # è¦ç´ 追å od['new_key'] = 'new_item_updated' # æ´æ° del od['new_key'] # åé¤ ã # è¦ç´ ã追å ãã¦ãè¦ç´ ã®é åºãå¤ãããªã od.update([ ('key_4', 'item_4'), ('key_5', 'item_5') ]) od # OrderedDict([('key_1', 'itme_1'), ('key_2', 'itme_2'), ('key_3', 'itme_3'), ('key_4', 'item_4'), ('key_5', 'item_5')])
OrderedDictã®ååéããè¦ç´ ã追å ãããåé¤ããããã¦ãé åºãå¤ãããªãï¼ã¨ããã®ãç¹å¾´ã§ãã
dictåã¯è¦ç´ ã追å ãããæã«ãã©ã®é çªã§è¦ç´ ã追å ãããã®ãã¯ç¹ã«ä¿åãã¦ãªãããã¼ã¨å¤ã ããè¦ãã¦ããã®ã§ããè¦ç´ ã追å ãããé åºãè¦ãã¦ãè¾æ¸ã欲ããï¼ãã¨è¨ã£ãæã«æ´»èºã§ããã®ããã®OrderedDictã§ãï¼
â¦ã§ãã£ãã¯ãã§ãããããã¯ããéå»ã®è©±ã§ãã
the insertion-order preservation nature of dict objects has been declared to be an official part of the Python language spec. ï¼å¼ç¨å ï¼https://docs.python.org/3/whatsnew/3.7.htmlï¼
ã¤ã¾ããPython3.7+ ã§ããã°ãããã©ã«ãã®dictã§ãé åºãä¿è¨¼ããã¦ãã¾ããããOrderedDictãªãããããªãããããï¼ã¨ãªãããããã¾ããããã¾ã ããæãã«ã¯æ©ãã®ã§ãï¼
dictã¨OrderedDictã®ä½¿ãåã
dictãé åºãä¿è¨¼ãããããã«ãªã£ãä»ããã¾ãéãããªãããã«è¦ããOrderedDictã§ãããä½ãéãããªãã¨çãæ®ããªãã¯ãã§ãããã®éããã¿ã¦ã¿ã¾ãããã
éããã®ï¼ï¼ãªãã¸ã§ã¯ãéã®æ¯è¼ãããéã«é åºã¾ã§æ¯è¼ãã¦ããã
ã¾ãï¼ã¤ç®ã®éãã¯ããªãã¸ã§ã¯ããæ¯è¼ããéã«ãé åºãä¸è´ãã¦ããã©ãããã¾ã§ãOrderedDictã¯è¦ã¦ããã¾ãã
# dictã¯é åºãéã£ã¦ãKey-Valueãä¸è´ãããåããªãã¸ã§ã¯ã dict_1 = { 'key_1': 'item_1', 'key_2': 'item_2' } dict_2 = { 'key_2': 'item_2', 'key_1': 'item_1' } dict_1 == dict_2 # True ã # OrderedDictã¯Key-Valueãä¸è´ãã¦ãé åºãç°ãªã£ããç°ãªããªãã¸ã§ã¯ã from collections import OrderedDict ã od_1 = OrderedDict([ ('key_1', 'itme_1'), ('key_2', 'itme_2'), ]) od_2 = OrderedDict([ ('key_2', 'itme_2'), ('key_1', 'itme_1'), ]) od_1 == od_2 # False
éããã®ï¼ï¼é åºã«é¢ããå®è£ ãããè±å¯
OrderedDictåã«ã¯popitemã¨ããã¡ã½ãããããã¾ãããã®ã¡ã½ããã«last弿°ã渡ããã¨ã§ããã¼ã¨å¤ãFIFOã»LIFOå¼ã§åãåºããã¨ãã§ãã¾ãã
dictåã§ãå®è£
ããã¦ããpopitemã¡ã½ããã§ãããlast弿°ã¯ãªããLIFOã§ãã¼ã¨å¤ãåå¾ãã¾ãã
from collections import OrderedDict ã od = OrderedDict([ ('key_1', 'itme_1'), ('key_2', 'itme_2'), ('key_3', 'itme_3'), ]) # popitemã¡ã½ããã¯FIFOã§ãLIFOã§ã使ç¨å¯è½ od.popitem(last=False) # ('key_1', 'item_1') od.popitem(last=True) # ('key_3', 'item_3') od # OrderedDict([('key_2', 'item_2')])
dequeï¼æ¬¡åã®è¨äºã§èª¬æãã¾ãããç°¡åã«è¨ãã¨å
é ãããæ«å°¾ãããpopãã§ãããã¥ã¼ã§ãï¼ã®ãããªä½¿ãæ¹ãã§ããdictãæ¬²ãï¼ã¨ãªã£ããOrderedDictãèæ
®ããã®ãããã§ãããã
ã¾ããOrderedDictã«ã¯move_to_endã¡ã½ãããå®è£
ããã¦ãã¦ãè¦ç´ ãå
é ã»æ«å°¾ã«ç§»åããããã¨ãã§ãã¾ãã
# è¦ç´ ãå é ã»æ«å°¾ã«ç§»åãã od = OrderedDict([ ('key_1', 'itme_1'), ('key_2', 'itme_2'), ('key_3', 'itme_3'), ]) ã od.move_to_end('key_1') od # OrderedDict([('key_2', 'itme_2'), ('key_3', 'itme_3'), ('key_1', 'itme_1')]) od.move_to_end('key_1', last=False) od # OrderedDict([('key_1', 'itme_1'), ('key_2', 'itme_2'), ('key_3', 'itme_3')]) ã # ãªãã¸ã§ã¯ãåå£«ãæ¯è¼ããéã«ãé åºã¾ã§æ¯è¼ãã
é åºãæèããdictããããFIFOã»LIFOã§è¦ç´ ãpopã§ããããè¦ç´ ãå
é ã»æ«å°¾ã«ç½®ãããããã®ãç¹å¾´ã§ãã
éããã®ï¼ï¼ä¸¦ã³æ¿ãã«ç¹åããå®è£
OrderedDictã¯dictããä¸¦ã³æ¿ãã«ç¹åããã¢ã«ã´ãªãºã ã§å®è£
ããã¦ãã¾ãããã®ãããé åºãå¤ããããè¦ç´ ã追å ã»åé¤ãããæ°éãªæä½ã«ããã¦ãããã©ã¼ãã³ã¹ãdictããåªãã¦ãã¾ãã
ãã®å©ç¹ãæ´»ãããã®ãLRUãã£ãã·ã¥ï¼Least Recently Used Cacheï¼ã®å®è£ ã§ããLRUãã£ãã·ã¥ã¨ã¯ãååéããæãæè¿ä½¿ããããã®ããã£ãã·ã¥ããããããªæ¹å¼ã§ãã ã¤ã¾ãããã£ãã·ã¥ç¨ã¡ã¢ãªããã£ã±ãã«ãªã£ãããæãå¤ããã£ãã·ã¥ããããã¼ã¿ãåé¤ããã¦ãããããªå®è£ ã«ãªãã¾ãã
# https://docs.python.org/ja/3/library/collections.html#ordereddict-examples-and-recipesãã from time import time ã class TimeBoundedLRU: "LRU Cache that invalidates and refreshes old entries." ã def __init__(self, func, maxsize=128, maxage=30): self.cache = OrderedDict() # { args : (timestamp, result)} self.func = func self.maxsize = maxsize self.maxage = maxage ã def __call__(self, *args): if args in self.cache: self.cache.move_to_end(args) # ãã£ãã·ã¥ãããå¤ãåç §ããããæ«å°¾ã«ç½®ã timestamp, result = self.cache[args] if time() - timestamp <= self.maxage: return result result = self.func(*args) self.cache[args] = time(), result if len(self.cache) > self.maxsize: # ãã£ãã·ã¥é度ãè¶ ããããå é ã®å¤ãåé¤ãã self.cache.popitem(0) return result
æå¾ã«
é åºã«é¢ãã¦ãã便å©ãªæ©è½ãå®è£
ããã¦ããOrderedDictã§ããï¼dictã®éããä¸è¨ã§è¨ãã¨ä»¥ä¸ã®ããã«ã¾ã¨ãããããã¨æãã¾ãã
ããã¼ããå¤ãåç
§ããã®ãã¡ã¤ã³ã ã£ããdictãé åºé¢é£æä½ãå¤ãï¼ä¸¦ã³æ¿ããªã©ï¼ãã¡ã¤ã³ãªãOrderedDictã
次åã¯dequeãç´¹ä»ãããã¨æãã¾ããããã§ã¯ãã¾ã次ããããããé¡ããã¾ãï¼
åèè³æ
- collections
- OrderedDict
- OrderedDictã¨Dictã®å·®å
ããPythonãcollectionsã©ã¤ãã©ãªãæ´»ç¨ããããã·ãªã¼ãºä¸è¦§
å å å¹ (å·çè¨äºã®ä¸è¦§)
ã¢ããªã±ã¼ã·ã§ã³ãµã¼ãã¹é¨ ãã£ããããã¡ã³ããµã¼ãã¹èª²
ååã®80代ç®åå«