Python:当尝试比较索引处的两个字符串时,列表索引超出范围?

时间:2018-02-25 21:00:43

标签: python string

我有这个函数来检查字符串是否包含三个或更多小写字母。

def lowerCaseValid(word):
lowCharList = ['abcdefghijklmnopqrstuvwxyz']
i = 0
flag = 0
while i <= len(word):
    j = 0
    while j <= len(lowCharList):
        if lowCharList[j] == word[i]:
            flag += 1
            j = 0
        else:
            j += 1
    i += 1
if flag >= 3:
    return True

简单来说,我传入一个字符串(word)并创建一个可接受字符列表(lowCharList)。

然后,我设置了一个嵌套的while循环,它在lowCharList的每个索引处检查word [i],直到找到匹配。

然后它重置lowCharList计数器并向flag添加1,然后移到word [i + 1]。

如果它在到达z时没有找到匹配,那么无论如何它都会移动到单词[i + 1]。

出于某种原因,为什么我在主函数中尝试输入样本。

def main():
  word = 'corRe!33'
  print(lowerCaseValid(word))

我收到此错误:

in lowerCaseValid
if lowCharList[j] == word[i]:
IndexError: list index out of range

为什么会抛出此错误?谢谢。

3 个答案:

答案 0 :(得分:1)

  

在运算符中使用python&#39;更容易......

    def lowerCaseValid(word):
       cnt = 0
       lowCharList = ['abcdefghijklmnopqrstuvwxyz']
       chars = lowCharList.pop ()
       for ch in word:
           if ch in chars:
           cnt += 1

       return  cnt >= 3
  

或使用只设置2行代码

def lowerCaseValid(word):

    lowCharList = ['abcdefghijklmnopqrstuvwxyz']

    return len(set(lowCharList.pop()) & set(word)) >=3
  

或带有map和lambda的一个班轮

def lowerCaseValid(word):

    return len(list(map(lambda x: x.islower, list(word)))) >=3

答案 1 :(得分:0)

更改

lowCharList = ['abcdefghijklmnopqrstuvwxyz']

lowCharList = list('abcdefghijklmnopqrstuvwxyz')

我相信这应该会有所帮助,因为你有一个只包含1个项目的列表,这样就可以创建一个包含24个项目(所有不同字母)的列表。

答案 2 :(得分:0)

正如heemayl在评论中指出的那样,lowCharList长达1个元素!现在你有两个选择:使lowCharList成为一个实际的列表(lowCharList = list ("abcd...")),或者保持lowCharList一个字符串,这将正常工作(删除定义中的括号。

我可以建议另一种方法:检查str.islower count是否加起来> = 3。所以:

lower_count = 0
for letter in word: 
    if letter.islower(): lower_count += 1
if lower_count >= 3: return True

另外,正如评论中所建议的那样:

return len ([letter for letter in word if letter.islower()]) >= 3 

会起作用(比我的答案更好,这只是它的扩展形式)