Python while循环中运行过远的索引之一

Python while循环中运行过远的索引之一,python,list,while-loop,count,index-error,Python,List,While Loop,Count,Index Error,我有一个函数,它可以计算任意给定文本中每个长度的单词数,包括最长的单词。我陷入了困境。皮查姆说: sana = sanat[i].strip(",.") IndexError: list index out of range 我不知道为什么变量I运行得太远(如果这里发生了这种情况)。这是Python中的问题,但这种问题实际上与语言无关。我非常感谢任何帮助 测试时,文本是任意的。另外,这些指纹是用来测试的 teksti = "Har du någon tanken. Om inrik

我有一个函数,它可以计算任意给定文本中每个长度的单词数,包括最长的单词。我陷入了困境。皮查姆说:

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
teksti=“在我的matematik中,你的名字是någon tanken.Om。”
def sanamaarat(merkkijono):
sanat=merkkijono.split()
sanat.sort(key=len)
lista=[]
lista.append(0)
阿普利斯塔=[]
apulista2=[]
对于萨纳特的萨那:
sana=sana.strip(“,.”)
pituus=len(萨那)
apulista.append(pituus)
joukko=列表(集合(apulista))
对于joukko中的数字:
apulista2.append(apulista.count(numero))
打印(sanat)
打印(apulista2)
印刷品(阿普利斯塔)
打印(int(apulista[-1])+1)
k=1
i=0
j=0
当k
输出结果如下:

    (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:\python\testailua.py", line 54, in <module>
        print(sanamaarat(teksti))
      File "C:\python\testailua.py", line 28, in sanamaarat
        sana = sanat[i].strip(",.")
    IndexError: list index out of range
(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
回溯(最近一次呼叫最后一次):
文件“C:\python\testailua.py”,第54行,在
印刷品(萨纳马拉特(teksti))
sanamaarat中第28行的文件“C:\python\testailua.py”
sana=sanat[i]。条带(“,.”)
索引器:列表索引超出范围
因此,我试图在返回列表的正确索引中添加所需的零。但是while循环中有一些逻辑错误,我看不到


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

第一个“0”(索引为零),因为有零个单词的长度为零。第一个“1”(索引1),因为有一个单词的长度为1。第一个“2”(索引2),因为有两个单词的长度为2。等等因此,每个索引都应该有与该索引长度相同的单词数



@kederrac通过从集合导入计数器解决了这个问题。这是一个很好的答案,但我想知道如何以原始方式使用循环,因为我仍然不知道循环中有什么错误。

如果您在
循环时修改
以检查索引
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
输出:

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

@jonne_k现在检查我的答案你想用你的代码做什么?也许我可以先找到一个好的解决方案0因为?第一个原因是什么?前2个原因是什么?“这会对我们很有帮助的。”乔恩,现在检查一下我的回答。我很抱歉。我不明白你评论的意思。最终目标是建立一个列表,其中索引0的字数为零,索引1的字数为一,依此类推。@jonne_k我通过聊天室的讨论完成了你的问题谢谢。我接受并投了赞成票。我不熟悉Python(和编程),所以我没有比循环更好的想法。我还是想知道我的圈出了什么问题,很难。所以,任何人都可以自由地修复循环版本。哦,我简短地提到的解决方案实际上是“解决”。。。有些事不在你的问题中。继续,不要伤害别人。
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]