[问题] 新手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