Python while循环中的一个索引运行得太远



我有一个函数,它应该计算每个长度的单词数,直到并包括任何给定文本中最长的单词。我陷入了困境。PyCharm说:

sana = sanat[i].strip(",.")  
IndexError: list index out of range

我不知道为什么变量I跑得太远(如果这里就是这样的话(。这是Python中的问题,但这种问题实际上与语言无关。如果有任何帮助,我将不胜感激。

文本是任意的测试。此外,这些指纹是为了测试。

    teksti = "Har du någon tanken. Om inriktningsmöjligheten i matematik."
    def sanamaarat(merkkijono):
        sanat = merkkijono.split()
        sanat.sort(key=len)
        lista = []
        lista.append(0)
        apulista = []
        apulista2 = []
        for sana in sanat:
            sana = sana.strip(",.")
            pituus = len(sana)
            apulista.append(pituus)
        joukko = list(set(apulista))
        for numero in joukko:
            apulista2.append(apulista.count(numero))
        print(sanat)
        print(apulista2)
        print(apulista)
        print(int(apulista[-1])+1)
        k = 1
        i = 0
        j = 0
        while k < int(apulista[-1]) + 1:
            sana = sanat[i].strip(",.")
            pituus = len(sana)
            if pituus == k:
                j += 1
                i += 1
            else:
                if j != 0:
                    lista.append(j)
                lista.append(0)
                k += 1
        return lista

输出在这里:

    (venv) C:python>testailua.py
    ['i', 'du', 'Om', 'Har', 'någon', 'tanken.', 'matematik.', 'inriktningsmöjligheten']
    [1, 2, 1, 1, 1, 1, 1]
    [1, 2, 2, 3, 5, 6, 9, 22]
    23
    Traceback (most recent call last):
      File "C:pythontestailua.py", line 54, in <module>
        print(sanamaarat(teksti))
      File "C:pythontestailua.py", line 28, in sanamaarat
        sana = sanat[i].strip(",.")
    IndexError: list index out of range

因此,我试图在返回列表的正确索引中添加所需的零。但是while循环中有一些我看不到的逻辑错误。


预期结果为[0,1,2,1,0,1,0,0,0,00,0,0,0,0.0,0,0,00,1]

第一个"0"(索引为零(,因为没有长度为零的单词。第一个"1"(到索引1(,因为有一个长度为1的单词。第一个'2'(到索引2(,因为有两个长度为2的单词。依此类推。所以每个索引都应该有与该索引长度相同的单词数。


@kederrac通过从集合导入Counter解决了这个问题。这是一个很好的答案,但我想知道如何用循环的原始方式来做,因为我仍然不知道循环中出了什么问题。

如果修改while循环以检查索引i的值和变量saant:的长度

print('saant lenght: ', len(sanat))
while k < int(apulista[-1]) + 1:
    print('i = ', i)
    sana = sanat[i].strip(",.")
    pituus = len(sana)
    if pituus == k:
        j += 1
        i += 1
    else:
        if j != 0:
            lista.append(j)
        lista.append(0)
        k += 1

输出:

saant lenght:  8
i =  0
i =  1
i =  1
i =  2
i =  3
i =  3
i =  4
i =  4
i =  4
i =  5
i =  5
i =  6
i =  6
i =  6
i =  6
i =  7
i =  7
i =  7
i =  7
i =  7
i =  7
i =  7
i =  7
i =  7
i =  7
i =  7
i =  7
i =  7
i =  7
i =  8
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-61-873709d80e77> in <module>
     41     return lista
     42 
---> 43 sanamaarat(teksti )
<ipython-input-61-873709d80e77> in sanamaarat(merkkijono)
     28     while k < int(apulista[-1]) + 1:
     29         print('i = ', i)
---> 30         sana = sanat[i].strip(",.")
     31         pituus = len(sana)
     32         if pituus == k:
IndexError: list index out of range

你会发现你试图访问一个与列表长度saanat相同值的索引,这是不可能的,所以你得到了IndexError

您的列表saanat的长度为8,因此您可以访问元素直到索引为7,但您可以看到,在IndexError之前,i的值为8,这会导致问题


要解决您的问题,您可以使用collections.Counter按长度查找单词的频率:

from collections import Counter
teksti = "Har du någon tanken. Om inriktningsmöjligheten i matematik."
def sanamaarat(merkkijono):
    count = Counter(map(len, merkkijono.split()))
    max_lenght = max(count)
    return [count.get(n, 0) for n in range(max_lenght + 1)]
print(sanamaarat(teksti))

输出:

[0, 1, 2, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]

最新更新