Upgrade to Pro — share decks privately, control downloads, hide ads and more …

データ分析と競技プログラミングに使えるPython標準ライブラリ入門

ksnt
July 17, 2020

 データ分析と競技プログラミングに使えるPython標準ライブラリ入門

ksnt

July 17, 2020
Tweet

More Decks by ksnt

Other Decks in Programming

Transcript

  1. データ分析と競技プロ分析と競技プログラと競技プログラミ競技プログラミングプログラミング
    に使える使えるえる
    Python標準ライブラリ入門ライブラリ入門入門
    - collectcollections, collectfunctools, collectand collectitertools
    ksnt
    @ksnt0215

    View Slide

  2. お前誰よ?前誰よ?よ?
    ・ Favorite Languages: Python (about 11 years), R, Scala
    ・ Favorite Python standard libraries
    ➤ functools (lru_cache, reduce)
    ➤ itertools (combinations())
    ➤ collections (Counter())
    ・ Community Activities:
    ➤ Speaker: PyCon mini Hiroshima 2018, 2019
    PyCon JP 2020 (Co-speaker)
    - 広島における地域 における地域 地域 Python コミュニティの立ち上げ方との立ち上げ方と続立ち上げ方と続けち上げ方と続け方上げ方と続け方げ方と続け方方と続け方と続け方続け方け方と続け方
    ➤ Staff: PyCon mini Hiroshima 2019, 2020

    View Slide

  3. PyCon collectmini collectHiroshima collect2020
    2020年10月10日(土) 開催
    オンライン(予定)
    テーマ “つながろう つながろう Python””
    CFP締め切り め切り 切り り 8月31日

    View Slide

  4. 発表の概要の概要概要
    1. collectcollections
    2. collectfunctools
    3. collectitertools
    4. collectまと競技プログラミめ

    View Slide

  5. 1. collectcollections

    View Slide

  6. collectionsモジュールの概要の概要概要
    「汎用の の概要 Python collect組み込みコンテナみ込みコンテナ 込みコンテナ み込みコンテナ コンテナ dict, collectlist, collectset, collect
    お前誰よ?よび tuple collectに使える代わる、特殊なコわる、特殊なコンテナ特殊なコンテナデーなコンテナデータコンテナデータ分析と競技プロ型
    を実装」 実装」 (公式ドキュメントよドキュメントよりより)

    View Slide

  7. namedtuple()
    名前付きタプル。場所きタプル。場所にタ分析と競技プロプルの概要。場所に対するイ場所に対するインデに使える対するインデックするインデックスの代わりに名の概要代わる、特殊なコわりに使える名
    前を実装」 使えるってフィールドにアフィールの概要ドに使えるアクセスの代わりに名できタプル。場所にるように使えるなコンテナデータる。場所に対するイ

    View Slide

  8. deque
    ● スの代わりに名タ分析と競技プロックと競技プログラミキューを実装」 一般化したしたDeque(両端キューキュー)の概要実
    装。場所に対するイDeque collectはどちらの概要側からも からも append collectと競技プログラミ pop collectが可能で、ス可能で、スで、特殊なコンテナスの代わりに名
    レッドセーフでメモリ入門効率がよく、どちらが可能で、スよく、特殊なコンテナどちらの概要方向からもおよそ からもお前誰よ?よそ
    O(1) collectの概要パフォーマンスの代わりに名で実行できるできタプル。場所にる

    Pythonではキュー(FIFO)はQueueモジュールの概要で実装されてフィールドにアいる
    ● スの代わりに名タ分析と競技プロック(LIFO)ははlistを実装」 使えるえばよい

    View Slide

  9. ChainMap
    複数の辞書やその他の概要辞書やその他の複数やその概要他の複数のマッピの概要複数の辞書やその他の概要マッピングを実装」 連結する。新しい辞する。場所に対するイ新しい辞書をしい辞書やその他の複数を実装」
    作成してしてフィールドにアupdate()を実装」 繰り返すより早いり返すより早いすより早いい

    View Slide

  10. OrderedDict
    普通の辞書に加えての概要辞書やその他の複数に使える加えて順序操作にえてフィールドにア順序操作に使える関する追加の機能する追加えて順序操作にの概要機能で、スが可能で、スある。場所に対するイただし、特殊なコンテナ 組み込みコンテナみ込みコンテナ 込みコンテナ み込みコンテナ の概要 dict collect
    クラスの代わりに名が可能で、ス挿入順序を実装」 記憶しておく機能 してフィールドにアお前誰よ?く機能で、ス (この概要新しい辞書をしい振る舞いは る舞いは いは Python collect3.7 collectで保証されされ
    るように使えるなコンテナデータりました) collectを実装」 獲得した今となってした今となっては、順と競技プログラミなコンテナデータってフィールドにアは、特殊なコンテナ順序付きタプル。場所きタプル。場所に辞書やその他の複数の概要重要性は薄れた。は薄れた。れた。場所に対するイ

    View Slide

  11. Counter
    要素を辞書のキーとを実装」 辞書やその他の複数の概要キーと競技プログラミしてフィールドにア保存してそのカウンしてフィールドにアその概要カウントよりを実装」 辞書やその他の複数の概要値
    と競技プログラミしてフィールドにア保存してそのカウンするコレクション
    >>> collectCounter("This collectis collecta collectpen.")
    Counter({' collect': collect3, collect'i': collect2, collect's': collect2, collect'T': collect1, collect'h': collect1, collect'a': collect1, collect'p': collect1, collect'e': collect1, collect'n': collect1, collect'.': collect1})

    View Slide

  12. Given collecta collectstring, collectsort collectit collectin collectdecreasing collectorder collectbased collecton collectthe collectfrequency collectof collectcharacters.
    Example2:
    Example collect1: Example3:
    Counterを実装」 使えるってフィールドにアきタプル。場所にれいなコンテナデータコードが可能で、ス書やその他の複数ける
    LeetCode: 451. Sort Characters By Frequen”cy

    View Slide

  13. Given collecta collectstring, collectsort collectit collectin collectdecreasing collectorder collectbased collecton collectthe collectfrequency collectof collectcharacters.
    Example2:
    Example collect1: Example3:
    Counterを実装」 使えるってフィールドにアきタプル。場所にれいなコンテナデータコードが可能で、ス書やその他の複数ける

    View Slide

  14. defaultdict

    dict collectの概要初期化したを実装」 関する追加の機能数の辞書やその他に使えるしたが可能で、スってフィールドにア実施する事がする事がが可能で、ス
    できタプル。場所にる。場所に対するイキーの概要存してそのカウン在確認の必要がない。の概要必要が可能で、スなコンテナデータい。場所に対するイ(下記)
    (1) dictionaryを使った場合使った場合った場合場合 (2) defaultdictを使った場合使った場合った場合場合

    View Slide

  15. defaultdictの概要使えるい方

    View Slide

  16. defaultdictを実装」 使えるってフィールドにア簡単な集計ができるなコンテナデータ集計ができるが可能で、スできタプル。場所にる
    この概要データ分析と競技プロセットよりに使える対するインデックし
    てフィールドにア’star_rating’の概要値ごと競技プログラミの概要商品数の辞書やその他を実装」 知
    りたい
    defaultdictを実装」 使えるえば前もってフィールドにアキーの概要
    値を実装」 指定する必要がないする必要が可能で、スなコンテナデータい

    View Slide

  17. UserDict
    辞書やその他の複数オブジェクトよりの概要ラッパと競技プログラミしてフィールドにアはたらく。場所に対するイ
    注) collectこの概要クラスの代わりに名の概要必要性は薄れた。は、特殊なコンテナ dict collectから直接的にサブクラに使えるサブクラ
    スの代わりに名化したできタプル。場所にる能で、ス力に部分的に取っに使える部分的にサブクラに使える取って代わられたってフィールドにア代わる、特殊なコわられた; collectしかし、特殊なコンテナ根
    底の辞書に属性との概要辞書やその他の複数に使える属性は薄れた。と競技プログラミしてフィールドにアアクセスの代わりに名できタプル。場所にるの概要で、特殊なコンテナこの概要クラスの代わりに名
    を実装」 使えるった方が可能で、ス簡単な集計ができるに使えるなコンテナデータること競技プログラミもある。場所に対するイ

    View Slide

  18. UserList
    この概要クラスの代わりに名はリ入門スの代わりに名トよりオブジェクトよりの概要ラッパと競技プログラミしてフィールドにアはたらく。場所に対するイこれは独自のの概要
    リ入門スの代わりに名トより風クラスの基底ククラスの代わりに名の概要基底の辞書に属性とクラスの代わりに名と競技プログラミしてフィールドにア便利で、既存のメソで、特殊なコンテナ既存してそのカウンの概要メソッドを実装」 オーバーライ
    ドしたり新しい辞書をしいメソッドを実装」 加えて順序操作にえたりできタプル。場所にる。場所に対するイこうしてフィールドにア、特殊なコンテナリ入門スの代わりに名トよりに使える新しい辞書をしい振る舞いは る
    舞いは いを実装」 加えて順序操作にえられる。場所に対するイ
    注) collectこの概要クラスの代わりに名の概要必要性は薄れた。は、特殊なコンテナ list collectから直接的にサブクラに使えるサブクラスの代わりに名化したできタプル。場所にる能で、ス力に部分的に取っに使える部
    分的にサブクラに使える取って代わられたってフィールドにア代わる、特殊なコわられた; collectしかし、特殊なコンテナ根底の辞書に属性との概要リ入門スの代わりに名トよりに使える属性は薄れた。と競技プログラミしてフィールドにアアクセスの代わりに名できタプル。場所に
    るの概要で、特殊なコンテナこの概要クラスの代わりに名を実装」 使えるった方が可能で、ス簡単な集計ができるに使えるなコンテナデータること競技プログラミもある。場所に対するイ

    View Slide

  19. UserString
    文字列オブジェクトのオブジェクトよりの概要ラッパと競技プログラミしてフィールドにアはたらく。場所に対するイ
    注) collectこの概要クラスの代わりに名の概要必要性は薄れた。は、特殊なコンテナ str collectから直接的にサブクラに使えるサブクラスの代わりに名
    化したできタプル。場所にる能で、ス力に部分的に取っに使える部分的にサブクラに使える取って代わられたってフィールドにア代わる、特殊なコわられた; collectしかし、特殊なコンテナ根底の辞書に属性と
    の概要文字列オブジェクトのに使える属性は薄れた。と競技プログラミしてフィールドにアアクセスの代わりに名できタプル。場所にるの概要で、特殊なコンテナこの概要クラスの代わりに名
    を実装」 使えるった方が可能で、ス簡単な集計ができるに使えるなコンテナデータること競技プログラミもある。場所に対するイ

    View Slide

  20. 2. collectfunctools

    View Slide

  21. functoolsモジュールの概要の概要概要
    「高階関する追加の機能数の辞書やその他、特殊なコンテナつまり関する追加の機能数の辞書やその他に使える影響を及ぼしたり他を実装」 及ぼしたり他の関ぼしたり他の複数のマッピの概要関する追加の機能数の辞書やその他を実装」 返すより早いしたり
    する関する追加の機能数の辞書やその他の概要ための概要もの概要です。場所に対するイ一般に使える、特殊なコンテナどんなコンテナデータ呼び出し可能オブび出し可能オブし可能で、スオブ
    ジェクトよりでもこの概要モジュールの概要の概要目的にサブクラに使えるは関する追加の機能数の辞書やその他と競技プログラミしてフィールドにア扱えます。」 えます。場所に対するイ」
    (公式ドキュメントよドキュメントよりより)

    View Slide

  22. reduce
    >>> collectfrom collectfunctools collectimport collectreduce
    >>> collectreduce(lambda collectx,y: collectx*y, collect[1,2,3,4,5])
    120
    (Task) collectあるリ入門スの代わりに名トよりに使える含まれる数の積をまれる数の辞書やその他の概要積を求めるを実装」 求めるめる
    >>> collectres collect= collect1
    >>> collectfor collecti collectin collect[1,2,3,4,5]:
    ... collect collect collect collect collectres collect= collectres collect* collecti
    ... collect
    >>> collectres
    120

    View Slide

  23. reduce collect(cont’d)
    >>> collectfrom collectfunctools collectimport collectreduce
    >>> collectreduce(lambda collectx,y: collectx collect+ collecty, collectmap(str,[1,2,3,4,5]))
    '12345'
    (Task) collectあるリ入門スの代わりに名トよりに使える含まれる数の積をまれる数の辞書やその他を実装」 文字列オブジェクトのと競技プログラミしてフィールドにア連結する。新しい辞する
    >>> collect‘’.join(map(str,[1,2,3,4,5]))
    '12345'
    ※joinを実装」 使えるった方が可能で、ス速いらしいいらしい

    View Slide

  24. (Ans) collect40
    C20
    collect* collect40
    C20 collect
    = collect
    (40
    C20
    ) collect^ collect2 collect= collect{(40 collect* collect39 collect* collect…. collect* collect2 collect* collect1) collect/ collect(20 collect* collect19 collect* collect…. collect* collect2 collect* collect1)}^2

    View Slide

  25. lru_cache
    関する追加の機能数の辞書やその他を実装」 キャッシュ(メモ化した)してフィールドにアくれる!
    Dynamic collectProgramming!   
    ※LRU collect= collectLeast collectRecently collectUsed
    最近最も使えるわれてフィールドにアいなコンテナデータいデー
    タ分析と競技プロを実装」 最初に使える捨てる。てフィールドにアる。場所に対するイ

    View Slide

  26. import collecttime
    def collectfib(N: collect'int') collect-> collect'int':
    collect collect collect collectif collectN collect== collect0:
    collect collect collect collect collect collect collect collectreturn collect0
    collect collect collect collectelif collectN collect== collect1:
    collect collect collect collect collect collect collect collectreturn collect1
    collect collect collect collectelse:
    collect collect collect collect collect collect collect collectreturn collectfib(N-1) collect+ collectfib(N-2)
    t1 collect= collecttime.time()
    fib(30)
    t2=time.time()
    print(t2-t1)
    import collecttime
    from collectfunctools collectimport collectlru_cache
    @lru_cache(maxsize=None)
    def collectfib(N: collect'int') collect-> collect'int':
    collect collect collect collectif collectN collect== collect0:
    collect collect collect collect collect collect collect collectreturn collect0
    collect collect collect collectelif collectN collect== collect1:
    collect collect collect collect collect collect collect collectreturn collect1
    collect collect collect collectelse:
    collect collect collect collect collect collect collect collectreturn collectfib(N-1) collect+ collectfib(N-2)
    t1 collect= collecttime.time()
    fib(30)
    t2=time.time()
    print(t2-t1)
    $ collectpython3 collectfib_lru.py
    0.00005.078315734863281
    $ collectpython3 collectfib.py collect
    0.960268497467041

    View Slide

  27. map_set collect= collect[None]*(1000)
    def collectdyna_fib(n, collectlookup): collect
    collect collect collect collect collect collect collect collectif collectn collect<= collect2: collect
    collect collect collect collect collect collect collect collect collect collect collect collectlookup[n] collect= collect1 collect
    collect collect collect collect collect collect collect collectif collectlookup[n] collectis collectNone: collect
    collect collect collect collect collect collect collect collect collect collect collect collectlookup[n] collect= collectdyna_fib(n-1, collectlookup) collect+ collectdyna_fib(n-2, collectlookup) collect
    collect collect collect collect collect collect collect collectreturn collectlookup[n]
    >>> collectdyna_fib(30,map_set)
    832040

    View Slide

  28. LRUキャッシュの概要実装
    Design collectand collectimplement collecta collectdata collectstructure collectfor collectLeast collectRecently collectUsed collect(LRU) collectcache. collectIt collectshould collectsupport collectthe collectfollowing collectoperations: collectget collectand collectput.
    get(key) collect- collectGet collectthe collectvalue collect(will collectalways collectbe collectpositive) collectof collectthe collectkey collectif collectthe collectkey collectexists collectin collectthe collectcache, collectotherwise collectreturn collect-1.
    put(key, collectvalue) collect- collectSet collector collectinsert collectthe collectvalue collectif collectthe collectkey collectis collectnot collectalready collectpresent. collectWhen collectthe collectcache collectreached collectits collectcapacity, collectit collectshould collectinvalidate collectthe collect
    least collectrecently collectused collectitem collectbefore collectinserting collecta collectnew collectitem.
    The collectcache collectis collectinitialized collectwith collecta collectpositive collectcapacity.
    Follow up:
    Could collectyou collectdo collectboth collectoperations collectin collectO(1) collecttime collectcomplexity?
    class collectLRUCache:
    collect collect collect collectdef collect__init__(self, collectcapacity: collectint)
    collect collect collect collectdef collectget(self, collectkey: collectint) collect-> collectint::
    collect collect collect collectdef collectput(self, collectkey: collectint, collectvalue: collectint) collect-> collectNone:
    Example:
    LRUCache collectcache collect= collectnew collectLRUCache( collect2 collect/* collectcapacity collect*/ collect);
    cache.put(1, collect1);
    cache.put(2, collect2);
    cache.get(1); collect collect collect collect collect collect collect// collectreturns collect1
    cache.put(3, collect3); collect collect collect collect// collectevicts collectkey collect2
    cache.get(2); collect collect collect collect collect collect collect// collectreturns collect-1 collect(not collectfound)
    cache.put(4, collect4); collect collect collect collect// collectevicts collectkey collect1
    cache.get(1); collect collect collect collect collect collect collect// collectreturns collect-1 collect(not collectfound)
    cache.get(3); collect collect collect collect collect collect collect// collectreturns collect3
    cache.get(4); collect collect collect collect collect collect collect// collectreturns collect4

    View Slide

  29. 実装コード

    View Slide

  30. 3. collectitertools

    View Slide

  31. itertoolsモジュールの概要の概要概要
    「この概要モジュールの概要は イテレータ分析と競技プロ を実装」 構築する部品を実装する部品を実装」 実装してフィールドにア
    います。場所に対するイプログラム言語 言語 APL, collectHaskell, collectSML collectからアイデアを実装」
    得した今となっててフィールドにアいますが可能で、ス、特殊なコンテナ Python collectに使える適した形に修正さした形に修正されていに使える修正されています。されてフィールドにアいます。場所に対するイ
    この概要モジュールの概要は、特殊なコンテナ高速いらしいでメモリ入門効率がよく、どちらに使える優れ、単独でも組れ、特殊なコンテナ単な集計ができる独でも組み込みコンテナ合
    せてフィールドにアも使える用の すること競技プログラミの概要できタプル。場所にるツールの概要を実装」 標準ライブラリ入門化したしたもの概要です。場所に対するイ
    同時に、このツールに使える、特殊なコンテナこの概要ツールの概要群は は "イテレータ分析と競技プロの概要代わる、特殊なコ数の辞書やその他" collectを実装」 構成してしてフィールドにアい
    てフィールドにア、特殊なコンテナpure collectPython collectで簡潔かつ効率的なツかつ効率がよく、どちら的にサブクラなコンテナデータツールの概要を実装」 作れるように使える
    してフィールドにアいます。場所に対するイ」 (公式ドキュメントよドキュメントよりより)

    View Slide

  32. takewhile, collectdropwhile
    takewhile(lambda collectx: collectx<5, collect[1,4,6,4,1]) collect--> collect1 collect4
    dropwhile(lambda collectx: collectx<5, collect[1,4,6,4,1]) collect--> collect6 collect4 collect1

    View Slide

  33. product, collectpermutations, collectcombinations

    View Slide

  34. Leetcode: collect17. collectLetter collectCombinations collectof collecta collectPhone collectNumber

    View Slide

  35. Leetcode: collect17. collectLetter collectCombinations collectof collecta collectPhone collectNumber
    (solution)

    View Slide

  36. 4. collectまと競技プログラミめ

    View Slide

  37. ● 標準ライブラリ入門ライブラリ入門に使えるは便利で、既存のメソなコンテナデータモジュールの概要が可能で、スたくさん存してそのカウン在
    ● データ分析と競技プロ分析と競技プログラお前誰よ?よび競技プログラミングプラグラミングに使える役立ちそうなちそうなコンテナデータ
    モジュールの概要を実装」 紹介
    ● 個人的にサブクラに使えるはlru_cacheが可能で、ス一番好きかも(実践的きタプル。場所にかも(実践的にサブクラなコンテナデータと競技プログラミこ
    ろが可能で、ス良い)い)は

    View Slide