#26722: [Python]玩得徹底,你知道float.is_integer()嗎?more_itertools.grouper呢?


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

學校 : 國立交通大學
編號 : 139794
來源 : [140.113.236.122]
最後登入時間 :
2022-09-03 11:13:16
d671. 11716 - Digital Fortress -- UVa11716 | From: [1.172.227.80] | 發表日期 : 2021-08-21 18:14

首先,判斷是不是完全平方數有很多方法,例如開根號取整數的平方等於自己,int(sqrt(x)) == x

其實float裡面有一個方法叫做is_integer(),於是你可以確認sqrt(x).is_integer()是True的話,就會是完全平方數了~

____________________________________________________________________________________________

如果去看itertools的官方文件,網頁最下面有一個好玩的東西叫做grouper

 

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)

 

構造很簡單,這個程式片段能夠把一行的東西變成你想要chunck(噎到)多少個、類似buffer的功能。

應用到這題可以怎麼玩呢?zip(*[iter(word)]*N),這兩個星號的意思不同,會先做乘法,之後才會解構。

得到的結果就會是題目所謂的row major。

_______________________________________________________________________________________________

如果要改成column major,其實與轉置矩陣(transpose)有點像,python的zip就有這樣的功能在!

於是把上面的東西組合進來  zip(      *zip(*[iter(word)]*N])      )   就得到column major了耶,酷吧?wwwwww

 
#26723: Re:[Python]玩得徹底,你知道float.is_integer()嗎?more_itertools.grouper呢?


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

學校 : 國立交通大學
編號 : 139794
來源 : [140.113.236.122]
最後登入時間 :
2022-09-03 11:13:16
d671. 11716 - Digital Fortress -- UVa11716 | From: [1.172.227.80] | 發表日期 : 2021-08-21 18:25

chunk打錯意思了,糟糕ww

part of something, especially a large part
一部分;(尤指)大部分,一大塊
a chunk of text一大段文字
substantial chunk of our profits我們利潤的很大一部分
Three hours is quite a chunk out of my working day.三個小時佔了我一個工作日中相當長的時間。
 
_____________________________________________
 
choke才是噎到、堵住
If you choke, or if something chokes you, you stop breathing because something is blocking your throat.
(使)窒息;(使)哽噎;(使)呼吸困難
She choked to death on a fish bone.她被魚刺骾住後窒息而死。
Children can choke on peanuts.小孩子吃花生會噎住的。
Peanuts can choke a small child.花生會噎住小孩。
to fill something such as a road or pipe, so that nothing can pass through
堵塞,阻塞;塞滿
At lunchtime the streets were choked with traffic.午餐時大街上塞車了。
 
 
#44213: Re: [Python]玩得徹底,你知道float.is_integer()嗎?more_itertools.grouper呢?


sam851015@gmail.com (多挖鼻孔有益身心健康)

學校 : 不指定學校
編號 : 277705
來源 : [123.192.228.253]
最後登入時間 :
2024-11-09 20:16:56
d671. 11716 - Digital Fortress -- UVa11716 | From: [123.192.228.253] | 發表日期 : 2024-11-13 13:40

雖然我用的不是這個方法,但這方法很有趣,又學到新東西了

想提一下在 python 3.13 的官方文檔中這個範例變成怎樣了

 

def grouper(iterable, n, *, incomplete='fill', fillvalue=None):
    "Collect data into non-overlapping fixed-length chunks or blocks."
    # grouper('ABCDEFG', 3, fillvalue='x') → ABC DEF Gxx
    # grouper('ABCDEFG', 3, incomplete='strict') → ABC DEF ValueError
    # grouper('ABCDEFG', 3, incomplete='ignore') → ABC DEF
    iterators = [iter(iterable)] * n
    match incomplete:
        case 'fill':
            return zip_longest(*iterators, fillvalue=fillvalue)
        case 'strict':
            return zip(*iterators, strict=True)
        case 'ignore':
            return zip(*iterators)
        case _:
            raise ValueError('Expected fill, strict, or ignore')

 

在這個版本中,展示更多不同的 group 行為,共有三個不同的模式,可以透過傳入 incomplete 這個參數修改

  1. fill 模式(預設模式):會將目標可迭代元素根據 n 的值拆分,不足的部分用 fillvalue 的值填充,預設是 'x'。(其實就是一樓的那個版本)
  2. strict 模式:直接調用 zip() ,但是將 zip() 的 strict 參數修改為 True,若該可迭代元素的長度無法被 n 整除,就會報錯。
  3. ignore 模式:也是調用 zip(),其他用預設值,效果是按照 n 的值進行拆分,最後面不夠分的就直接忽略。

 

和之前版本的區別在於不完全依賴 itertools.zip_longest,而是用 zip 就可以做

在這題目中,我們只需要用到 ignore 模式,自己手搓就可以了

因為 ZeorJudge 的 python 版本只有到 3.6 ,而 3.6 版的 zip 沒有 strict 參數,且長度並非完全平方數的字串你應該要在更前面就用 if 篩掉

把範例中那些用不到的部分去掉,就是我們需要的函數

 

def grouper(iterable, n):
# grouper('ABCDEFGHI', 3) → ABC DEF GHI iterators = [iter(iterable)] * n return zip(*iterators)

 

當然,這個不是最終答案,還要再處理過,怎麼處理就自己來吧,一樓都有教了

 

 
ZeroJudge Forum