[問題] 新手for+判斷式問題

作者: yvmi (鞭策自己社社長)   2020-02-25 11:52:24
這是一個在 codewars 裡面的小練習:
目標是做一個函式判斷一個字串裡面是否有包含所有英文字母。
我的作法是把所有的英文轉成 ascii 碼,建成一個 list
然後將 list 中非英文的 ascii 碼以外的刪除。
但是實測時發現有部分數值在 97-122 以外的值並不會被刪除。
比方說如果投入的 s = 'abcdef!!!!'
^^→這兩碼驚嘆號會被刪除,後面兩碼不會。
如果是在字母的中間則是連續第二個字元不會被刪除。
請問這個判斷式的問題在哪裡?
感謝大家。
def is_pangram(s):
s = s.lower()
s_list = list(s)
ascii_i = []
for i in s_list:
ascii_i.append(ord(i))
for j in ascii_i:
if j<97 or j>122:
ascii_i.remove(j)
.....
作者: cuteSquirrel (松鼠)   2020-02-25 11:58:00
不建議在for...in...裡面刪除元素,索引值會跑掉
作者: TitanEric (泰坦)   2020-02-25 12:05:00
有更簡潔的寫法 string有is_alpha可以判斷英文字母 所以可以先過濾出字母後再看放入set的大小是不是26
作者: cuteSquirrel (松鼠)   2020-02-25 13:45:00
模仿原a-z判斷的方法改寫 https://bit.ly/38S6M37
作者: poototo (poototo)   2020-02-25 19:53:00
remove元素後,後一元素會往前頂替然後下個for會送出再下一元素,所以被刪元素的下一元素等於躲掉了
作者: cuteSquirrel (松鼠)   2020-02-25 19:58:00
對。原本在 for...in...list 刪除元素的討論可參考https://bit.ly/2w5cjVk
作者: poototo (poototo)   2020-02-25 20:09:00
from collections import Counterlen([k for k in Counter(x).keys() if k.isalpha()])sorry,有點多此一舉,直接set()就好
作者: zamperla (地鼠王)   2020-02-26 20:36:00
用ord( )吧 比較直覺
作者: BalloonBa (巴倫巴)   2020-02-27 17:21:00
照你這樣寫,其實第一個迴圈加判斷式就解了

Links booklink

Contact Us: admin [ a t ] ucptt.com