如何修复从列表中打印单词的 IndexError 问题

How to fix an IndexError Problem for printing words from a list

对于我的开始 python class 我们必须编写一个代码来确定一个数字是否为素数,找出句子中的平均单词长度,确定句子中哪些单词具有素数长度, 然后打印具有质数长度的单词。 (我们不需要担心此作业的标点符号)所以我编写了以下代码,但是当我尝试打印具有素数长度的单词时,它返回 list index out of range 代码在第一个 for 循环中运行良好,并且 returns 对于输入的素数长度都是正确的,但我无法让它打印出实际的单词。请帮忙!

from statistics import mean


def is_prime(n):
    if n < 2:
        return(False)
    else:
        for i in range(2, n + 1):
            if n == 2:
                return(True)
                break
            elif n % i == 0:
                return(False)
                break
            else:
                return(True) 
                break   
    return


user_input = " "
while user_input != "quit":
    user_input = input("Please enter a random sentence (or type 'quit' to exit): ")
    word_list = user_input.split()
    x = len(word_list)
    word_length = []

    for i in range(x):
        word_length.append(len(word_list[i]))


    for i in word_length:
        if is_prime(i) == True:  
            print(word_list[i])             #I think this is where the problem is???
          
            

    avg = mean(word_length)
    print("Average word length: " + str(avg))
    print("The following words have prime lengths: ")
    
    

while user_input == "quit":
    print("Goodbye!")
    break

将第二个for循环改为-

for i in range(len(word_length)):
    if is_prime(word_length[i]) == True:  
        print(word_list[i])             #I think this is where the problem is???

您正在使用实际字长来访问索引列表,如果 word_list 中的元素数量不等于字的长度,则该列表不起作用。循环 range(len(word_length)) 解决问题

user_input,PRIME,NON_PRIME = '',[],[]
while user_input != "quit":
    user_input = input("Please enter a random sentence (or type 'quit' to exit):")
    if user_input == "quit":break
    else:
        for i in user_input.split(" "):#user_input text converted to list with separator = ','
            #PRIME CHECK
            if len(i) > 1:
                for j in range(2,len(i)):
                    if (len(i)% j) == 0:
                        NON_PRIME.append([i,len(i)])
                        break
                else:PRIME.append([i,len(i)])
             else:NON_PRIME.append([i,len(i)])
        print(" PRIME:",PRIME,"\n NON PRIME",NON_PRIME)

输出 请输入随机句子(或输入 'quit' 退出):PRIME CHECKER WITH PYTHON 总理:[['PRIME', 5], ['CHECKER', 7]]
非素数 [['WITH', 4], ['PYTHON', 6]]

在你的第二个循环中, i 的值将是单词的长度,而 word_list 的长度是不同的,假设句子是:“我是学生”然后列出 word_length 看像 [1,2,1,7] 并且你打印 word_list[1],word_list[2],word_list[1] 和 word_list[7], 但是word_list 的长度是 4,所以它会给出 word_list[7] 的 IndexError,所以正确的代码如下所示:

 for i in range(x):           #here, i starts from 0 and ends at length of word_list
    if is_prime(len(word_list[i])) == True:     
        print(word_list[i])

不需要下面的循环。

for i in range(x):
    word_length.append(len(word_list[i]))