遍历列表的索引以查看它们是否相等



我正在尝试编写一个函数来分析一个字符串以检查它是否连续包含两个相同的字母。 我为它编写了函数,但它不起作用,知道为什么吗?

import itertools
def double_letters(word):
word = list(word)
for index, item in enumerate(word):
for next_item in word[index + 1:]:
if item == next_item:
return True
else:
return False

你在这里做了一些奇怪的事情,但主要的是辅助循环。如果你有索引,为什么需要它?你知道下一个索引只是+1,你甚至没有在这里同时使用(索引和值)。

第二大问题是,如果字符不匹配,则返回 false;这将仅返回前两个字符的匹配结果,但您正在寻找第一个匹配项,因此您应该只返回匹配项。您可以使用变量来跟踪此情况,但也可以在需要时简单地返回 true,如果从未满足该条件,则返回 false。

最后,你不需要枚举,尽管它很好。对于这种方法,我只枚举到倒数第二个索引 (enumerate(word[0:len(word)-1])。或者,不要像下面的示例那样使用枚举:

import itertools
def double_letters(word):
word = list(word)
for index in range(len(word)-1):
if word[index] == word[index+1]:
return True
return False;
print(double_letters('world hello '))

这个函数有三个问题,其中两个在这个行上:

for next_item in word[index + 1:]:
  • 您正在迭代item后面的所有字母,而您唯一关心的next_item紧接的下一个字母(即word[index+1],而不是整个切片word[index+1:]
  • word[index+1]将离开这个词的边缘,让你没有next_item比较。 要解决此问题,您可以检查您是否在末尾并对其进行特殊处理,或者您可以只迭代外循环中的word[:-1](除最后一个字母之外的所有内容)。

最后一个问题(以及导致您的直接错误的问题)与此if/else有关:

if item == next_item:
return True
else:
return False

无论如何,您将在进行第一次比较时立即返回 - 因此,如果它是前两个字母,则此函数只会计算一个双字母。 它永远不会比较其他任何东西。 要解决此问题,请删除else,并在函数的最后发生return False,以便我们仅在没有找到返回 True 的理由时才返回 False。

一起:

def double_letters(word):
for index, item in enumerate(word[:-1]):
next_item = word[index+1]
if item == next_item:
return True
return False

assert double_letters("hello")
assert not double_letters("abcdef")

具有itertools的解决方案可能是使用groupby,它将一个可迭代对象分组到相同的项目中;您可以检查是否有任何组长于 1 个项目,如下所示:

import itertools
def double_letters(word):
for _, g in itertools.groupby(word):
if len(list(g)) > 1:
return True
return False

但是编写这种类型的顺序项检查的最简单方法是使用自身的切片zip可迭代对象,如下所示:

def double_letters(word):
for item, next_item in zip(word, word[1:]):
if item == next_item:
return True
return False

或者更简单地说,使用any

def double_letters(word):
return any(item == next_item for item, next_item in zip(word, word[1:]))

如果你没有一次相等,你就不能通过返回 false 直接停止。你需要等待结束。也不需要嵌套循环,使用zip迭代字符串的 2 个连续字符

def double_letters(word):
for current_ch, next_ch in zip(word, word[1:]):
if current_ch == next_ch:
return True
return False

最新更新