这段针对其他字母函数的 Python 代码有什么问题?

Pyt*_*ada 2 python function modulo

我正在尝试编写一个函数来提取任何给定单词的所有其他字母。有人可以解释一下为什么这段代码不产生所有其他字母吗?

def other_letter(word):
    other_letter = ""
    for letter in word:
        if word.index(letter) % 2 == 0:
            other_letter += letter
    return other_letter

print(other_letter("Hello World!"))
Run Code Online (Sandbox Code Playgroud)

我认为如果索引的模等于 0 那么它应该拉出所有其他字母并将其添加到other_letter? 我找到了另一种方法来解决这个问题,无需模运算符,但我想知道为什么模运算符在这里不起作用?

Den*_*er1 5

您面临的问题是,在代码中,您正在检查单词中字母的索引。这意味着它找到字母的第一个实例,而不是当前实例。

"l"始终是索引2"o"始终是索引4,因此所有 l 和 o 都将出现在结果字符串中,而不仅仅是第一个"l"和第一个"o"

要在跟踪索引的同时迭代 Iterable,您可以使用enumerate生成索引、值对的 Iterable。但在这种情况下,它仍然不是最简洁的解决方案。

一个更简单的解决方案是对括号运算符使用skip参数。

当用于[]包含字符串的序列时,第一个参数是开始索引,第二个参数是结束索引(最后一个元素之后),第三个参数是跳过量。

如果省略开始和结束索引,则只需迭代整个字符串,并且仍然可以应用skip参数来跳过一定数量的字母。

def other_letter(word: str):
    """Return a string of every other letter in word."""
    return word[::2]
Run Code Online (Sandbox Code Playgroud)

例子:

>>> word = "Hello World!"
>>> print(word[::2])
'HloWrd'
Run Code Online (Sandbox Code Playgroud)

如果你想从第二个字母开始,你可以使用起始索引为 1 而不是默认的 0:

>>> print(word[1::2])
'el ol!'
Run Code Online (Sandbox Code Playgroud)