我有一个函数,它应该计算每个长度的单词数,直到并包括任何给定文本中最长的单词。我陷入了困境。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]