看板 Python 關於我們 聯絡資訊
這是一個在 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) ..... -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.249.220.81 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1582602746.A.5C9.html
cuteSquirrel: 不建議在for...in...裡面刪除元素,索引值會跑掉 02/25 11:58
※ 編輯: yvmi (60.249.220.81 臺灣), 02/25/2020 12:04:23
TitanEric: 有更簡潔的寫法 string有is_alpha可以判斷英文字母 所 02/25 12:05
TitanEric: 以可以先過濾出字母後再看放入set的大小是不是26 02/25 12:05
cuteSquirrel: 模仿原a-z判斷的方法改寫 https://bit.ly/38S6M37 02/25 13:45
poototo: remove元素後,後一元素會往前頂替 02/25 19:53
poototo: 然後下個for會送出再下一元素,所以被刪元素的下一元素 02/25 19:56
poototo: 等於躲掉了 02/25 19:56
cuteSquirrel: 對。原本在 for...in...list 刪除元素的討論可參考 02/25 19:58
cuteSquirrel: https://bit.ly/2w5cjVk 02/25 19:58
poototo: from collections import Counter 02/25 20:09
poototo: len([k for k in Counter(x).keys() if k.isalpha()]) 02/25 20:10
poototo: sorry,有點多此一舉,直接set()就好 02/25 20:35
zamperla: 用ord( )吧 比較直覺 02/26 20:36
BalloonBa: 照你這樣寫,其實第一個迴圈加判斷式就解了 02/27 17:21