#26736: [Python]可以用deque、defaultdict、groupby、ilen(count)解這題


406490150@gms.tku.edu.tw (我是朱朱)

學校 : 國立交通大學
編號 : 139794
來源 : [140.113.236.122]
最後登入時間 :
2022-09-03 11:13:16
b771. 46. Play with Words -- NTU批改娘計算機程式設計課程 | From: [1.172.242.197] | 發表日期 : 2021-08-22 16:16

我用到的套件如下,後面會講述這些套件的用法及用途

from sys import stdin
from collections import deque, defaultdict
from itertools import groupby, count

1. 操作方法 - 使用deque(double-ended queue, 雙向佇列)

collections.deque與題目操作方法有一一對應關係
剩下就是對字串進行處理、操作(if x[0]==insert: ...)

題目的方法python deque
insert left xappendleft(x)
insert right xappend(x)
insert k xinsert(k-1, x)
delete leftpop()
delete rightpopleft()
delete kdel deque[k-1]

2. 提取連續字串個數 - 使用groupby

groupby大致上可以達成這些事情

[k for k, g in groupby('AAAABBBCCDAABBB')]  #--> A B C D A B
[list(g) for k, g in groupby('AAAABBBCCD')] #--> AAAA BBB CC D

k就是相同連續字串的單個字元,g就會是整串文字,但g是一個iterator沒有len()可以用,第三步驟就來處理這些事情

更多groupby詳細說明可以參考這篇,或參考官方文件

3. 計算iterator長度的方法 - ilen

我是參考 more-itertools.ilen 的方法,就可以輕鬆算出長度了
不然一般可能是使用 len(tuple(g)),把g實體化就可以算長度

def ilen(iterable):
    """Return the number of items in *iterable*.

        >>> ilen(x for x in range(1000000) if x % 3 == 0)
        333334

    This consumes the iterable, so handle with care.

    """
    # This approach was selected because benchmarks showed it's likely the
    # fastest of the known implementations at the time of writing.
    # See GitHub tracker: #236, #230.
    counter = count()
    deque(zip(iterable, counter), maxlen=0)
    return next(counter)

4. 計算最長連續字串 - defaultdict

defaultdict(list)可以做到key是長度、value則是用一個list儲存不定長度的資料
對應到groupby產生的資料,di[ilen(g)].append(k) 就完成拉~
之後,找到max(di)就可以找到想要的字有哪些了。至於萬一沒找到(空deque),我直接輸出0就AC

 
 
 
#26737: Re:[Python]可以用deque、defaultdict、groupby、ilen(count)解這題


406490150@gms.tku.edu.tw (我是朱朱)

學校 : 國立交通大學
編號 : 139794
來源 : [140.113.236.122]
最後登入時間 :
2022-09-03 11:13:16
b771. 46. Play with Words -- NTU批改娘計算機程式設計課程 | From: [1.172.242.197] | 發表日期 : 2021-08-22 16:17

挖屋,版面被弄爛了

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

_____

 
#26738: Re:[Python]可以用deque、defaultdict、groupby、ilen(count)解這題


406490150@gms.tku.edu.tw (我是朱朱)

學校 : 國立交通大學
編號 : 139794
來源 : [140.113.236.122]
最後登入時間 :
2022-09-03 11:13:16
b771. 46. Play with Words -- NTU批改娘計算機程式設計課程 | From: [1.172.242.197] | 發表日期 : 2021-08-22 16:18

3. 計算iterator長度的方法 - ilen

我是參考 more-itertools.ilen 的方法,就可以輕鬆算出長度了
不然一般可能是使用 len(tuple(g)),把g實體化就可以算長度

def ilen(iterable):
    """Return the number of items in *iterable*.

        >>> ilen(x for x in range(1000000) if x % 3 == 0)
        333334

    This consumes the iterable, so handle with care.

    """
    # This approach was selected because benchmarks showed it's likely the
    # fastest of the known implementations at the time of writing.
    # See GitHub tracker: #236, #230.
    counter = count()
    deque(zip(iterable, counter), maxlen=0)
    return next(counter)

4. 計算最長連續字串 - defaultdict

defaultdict(list)可以做到key是長度、value則是用一個list儲存不定長度的資料
對應到groupby產生的資料,di[ilen(g)].append(k) 就完成拉~
之後,找到max(di)就可以找到想要的字有哪些了。至於萬一沒找到(空deque),我直接輸出0就AC

 
 
 
#26739: Re:[Python]可以用deque、defaultdict、groupby、ilen(count)解這題


406490150@gms.tku.edu.tw (我是朱朱)

學校 : 國立交通大學
編號 : 139794
來源 : [140.113.236.122]
最後登入時間 :
2022-09-03 11:13:16
b771. 46. Play with Words -- NTU批改娘計算機程式設計課程 | From: [1.172.242.197] | 發表日期 : 2021-08-22 16:20

我用到的套件如下,後面會講述這些套件的用法及用途

from sys import stdin
from collections import deque, defaultdict
from itertools import groupby, count

1. 操作方法 - 使用deque(double-ended queue, 雙向佇列)

collections.deque與題目操作方法有一一對應關係
剩下就是對字串進行處理、操作(if x[0]==insert: ...)

題目的方法python deque
insert left xappendleft(x)
insert right xappend(x)
insert k xinsert(k-1, x)
delete leftpop()
delete rightpopleft()
delete kdel deque[k-1]

2. 提取連續字串個數 - 使用groupby

groupby大致上可以達成這些事情

[k for k, g in groupby('AAAABBBCCDAABBB')]  #--> A B C D A B
[list(g) for k, g in groupby('AAAABBBCCD')] #--> AAAA BBB CC D

k就是相同連續字串的單個字元,g就會是整串文字,但g是一個iterator沒有len()可以用,第三步驟就來處理這些事情

更多groupby詳細說明可以參考這篇,或參考官方文件

 
ZeroJudge Forum