Один из индексов слишком длинный в цикле Python while - PullRequest
1 голос
/ 07 марта 2020

У меня есть функция, которая должна подсчитывать количество слов каждой длины, включая самое длинное слово в любом тексте. Я застрял в моей л oop. PyCharm говорит:

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

Понятия не имею, почему переменная запускается слишком далеко (если это то, что здесь происходит). Это в Python, но проблема такого рода не имеет ничего общего с языком. Я очень ценю любую помощь.

Текст произвольный для тестирования. Кроме того, распечатки для тестирования , Но в то время как l oop есть какая-то логическая ошибка, которую я не вижу.


Ожидаемый результат [0,1,2,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0 , 0,0,0,0,1]

Первый '0' (для индекса ноль), потому что есть нулевые слова с нулевой длиной. Сначала «1» (для индекса 1), потому что есть одно слово длины один. Сначала '2' (для индекса 2), потому что есть два слова длины два. И так далее. Таким образом, у каждого индекса должно быть количество слов, имеющих длину этого индекса.


@ kederra c решил эту проблему с помощью импорта Counter из коллекций. Это хороший ответ, но я хотел бы знать, как сделать это оригинально с помощью циклов, потому что я до сих пор не знаю, что не так в моем l oop.

1 Ответ

2 голосов
/ 07 марта 2020

, если вы изменили while l oop для проверки значения индекса 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]
...