作者yvmi (鞭策自己社社長)
看板Python
標題[問題] 新手for+判斷式問題
時間Tue Feb 25 11:52:24 2020
這是一個在 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://webptt.com/m.aspx?n=bbs/Python/M.1582602746.A.5C9.html
1F:推 cuteSquirrel: 不建議在for...in...裡面刪除元素,索引值會跑掉 02/25 11:58
※ 編輯: yvmi (60.249.220.81 臺灣), 02/25/2020 12:04:23
2F:推 TitanEric: 有更簡潔的寫法 string有is_alpha可以判斷英文字母 所 02/25 12:05
3F:→ TitanEric: 以可以先過濾出字母後再看放入set的大小是不是26 02/25 12:05
5F:推 poototo: remove元素後,後一元素會往前頂替 02/25 19:53
6F:→ poototo: 然後下個for會送出再下一元素,所以被刪元素的下一元素 02/25 19:56
7F:→ poototo: 等於躲掉了 02/25 19:56
8F:推 cuteSquirrel: 對。原本在 for...in...list 刪除元素的討論可參考 02/25 19:58
10F:推 poototo: from collections import Counter 02/25 20:09
11F:→ poototo: len([k for k in Counter(x).keys() if k.isalpha()]) 02/25 20:10
12F:推 poototo: sorry,有點多此一舉,直接set()就好 02/25 20:35
13F:推 zamperla: 用ord( )吧 比較直覺 02/26 20:36
14F:推 BalloonBa: 照你這樣寫,其實第一個迴圈加判斷式就解了 02/27 17:21