作者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/cn.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