1

此代码将返回数字和非字母数字字符的索引。但是,它只会返回第一个空格的索引,而不是其他任何空格的索引,我不确定为什么。

shoestring = "fwefw1234132 lkjaldskf98:[]['asd fads fadsf"

for n in shoestring:
    if n.isalpha():
        continue
    else:
        print n, shoestring.index(n)
4

2 回答 2

2

字符串 index() 方法返回第一个匹配项的索引。您正在向它询问第一个匹配的子字符串,' '这就是它给出的。

于 2013-08-13T03:00:15.810 回答
2

每次,你都在打电话shoestring.index(n)。那n只是一个' '角色。它无法知道您是想要第一个空格,还是第二个空格,还是第 43 个空格,所以它只会返回第一个空格。

执行此操作的正确方法是跟踪索引,而不是通过搜索找到它。* 该enumerate函数使这变得非常简单:

for i, n in enumerate(shoestring):
    if n.isalpha():
        continue
    else:
        print n, i

作为旁注,您可以通过反转 使您的代码更简单if,因此您不需要continue

for i, n in enumerate(shoestring):
    if not n.isalpha():
        print n, i

filter使用函数或推导可以获得更多乐趣:

nonalphas = ((n, i) for i, n in enumerate(shoestring) if not n.isalpha())
print '\n'.join('{} {}'.format(n, i) for n, i in nonalphas)

* 即使你的搜索正确,它也会让你的代码变慢很多。如果你有一百万个所有空格的字符串,每次搜索都要检查一百万个字符,而且你必须对每个空格执行一次,这意味着一万亿次比较。如果您只是随时跟踪索引,则只有一百万次比较。用技术术语来说,它是线性的而不是二次的。

于 2013-08-13T03:01:11.970 回答