簡體   English   中英

Python:嘗試在索引處比較兩個字符串時,列表索引超出范圍?

[英]Python: list index out of range when trying to compare two strings at index?

我具有此功能來檢查字符串是否包含三個或更多個小寫字母。

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

簡單來說,我傳入一個字符串(單詞)並創建一個可接受的字符列表(lowCharList)。

然后,我建立了一個嵌套的while循環,該循環在lowCharList的每個索引處檢查word [i],直到找到匹配項為止。

然后,它重置lowCharList計數器並將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

為什么會引發此錯誤? 謝謝。

使用python的in運算符更容易...

    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

或一張帶有地圖和lambda的班輪

def lowerCaseValid(word):

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

使用列表推導和string.ascii_lowercase而不是重新定義小寫字母的另一種替代方法:

from string import ascii_lowercase

def lowerCaseValid(word):
    return sum[x in ascii_lowercase for x in word] >= 3

列表的理解是如何遍歷單詞中的每個字母的。 x in ascii_lowercasex in ascii_lowercase將返回布爾值True(1)或False(0),然后對True sum

更改

lowCharList = ['abcdefghijklmnopqrstuvwxyz']

lowCharList = list('abcdefghijklmnopqrstuvwxyz')

我相信這會有所幫助,因為您的列表僅包含1個項目,而這樣,您將創建一個包含24個項目(所有字母均不同)的列表。

正如heemayl在評論中指出的那樣, lowCharList為1個元素! 現在,您有2個選項:將lowCharList設置為實際列表( lowCharList = list ("abcd...") ),或將lowCharList保留為字符串,這將正常工作(刪除定義中的括號)。

可能我建議另一種方法:檢查str.islower計數是否總計> = 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 

會起作用(比我的答案更好,這只是它的擴展形式)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM