Python 3.3.2-创建单词长度列表

2024-04-29 03:25:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一串标点符号的单词,比方说。。。

string = 'Did the quick brown fox *really* jump over the fence?'

我已经过滤掉了标点符号,所以现在是:

'Did the quick brown fox really jump over the fence'

我把它分成了一个单子。

list = string.split()

现在,使用list,我现在需要将每个单词的长度计算到一个列表中,列表的长度是最长的单词。清单的内容如下:

lengthList = [1_letter_words, 2_letter_words, 3_letter_words, ...]

因此,对于string,应该是:

lengthList = [0, 0, 4, 2, 3, 1]

不幸的是,我做这件事有困难。有人能帮忙吗?

谢谢你。


Tags: thestringquick单词listoverwords标点符号
3条回答
from collections import Counter
Data = 'Did the quick brown fox really jump over the fence'
Freq = Counter([len(words) for words in Data.split()])
print ([Freq[Num] if Num in Freq else 0 for Num in range(1, max(Freq)+1) ])

输出

[0, 0, 4, 2, 3, 1]

易于理解的版本

from collections import Counter
Data = 'Did the quick brown fox really jump over the fence'
Freq = Counter([len(words) for words in Data.split()])
Result = []
for Num in range(1, max(Freq)+1):
    if Num in Freq:
        Result.append(Freq[Num])
    else:
        Result.append(0)
print (Result)

我不想在没有给你一个正确答案的情况下对你喋喋不休,所以如果你不关心良好的编码实践,请跳过。

不要使用像liststring这样的变量名,因为在list的情况下,这是您正在创建的类型的名称。事实上,这就是你如何创建一个空实例的类型:

something=list()       # this is an empty list!

这会使参考list[2]或类似的东西变得混乱。所以很明显没有出现任何错误,但是为了可读性,请尝试给出有意义的变量名。

好吧,我已经说完了,你要找的代码是

st='Did the quick brown fox really jump over the fence'.split()
c=[len(i) for i in st] # gives [3, 3, 5, 5, 3, 6, 4, 4, 3, 5]
counts=[0]*max(c)      # gives [0, 0, 0, 0, 0, 0]
for i in range(len(c)):
  counts[c[i]-1]+=1    # adds 1 to each index of c[i] (we subtract 1 because of 0-based indices)
print(counts)          # gives us the answer: [0, 0, 4, 2, 3, 1]

我把这些步骤中的一些做得比你提出的挑战更为先进,如果这恰好是你的目标的话,我会阻止你在作业中使用这些步骤。在这个解决方案中使用的一些工具至少比您正在使用的工具要先进一点,但是如果您只是为了理解代码而学习Python,那么我希望这将是最有启发性的,可能会让您想到一些非常酷的东西,您可以用Python简明地做。尽管如此,让我们来看看:

我假设st赋值足够清楚,我们不需要讨论它,但是请注意,当我赋值时,它就在那里被拆分了。我只是在偷懒,我们可以分两步来做,但这不是问题的症结所在,让我们继续。

c=[len(i) for i in st]

只意味着“对于每个元素,我们称之为i,在st中,在列表中返回len(i),并使该列表成为c”。这可能看起来让人望而生畏,但是列表理解并没有那么糟糕,正如您所看到的,它们为您节省了大量的编码时间。这是一个相当温和的实现,真的。

counts=[0]*max(c)

表示在每个空间中用0s创建一个列表,并使其重复多次是cmax。所以这将需要最长的单词,在本例中是6个字母的单词'really',并使列表中的6个元素变长。这将确保我们有一个列表,其中包含我们遇到的每个长度词的空格。

for i in range(len(c)):
  counts[c[i]-1]+=1

哦,天哪,现在我们在做饭。请注意,我们正在遍历列表c,因此我们遍历的每个项都是相应单词的长度:

  • 第一个元素是3,对应于Did
  • 第二个元素是3,对应于the
  • 。。。
  • 最后一个元素是5,对应于fence

这就是c[i]的意义,但是counts[c[i]-1]是什么?好的,counts将把1加到你找到的每个长度上,所以当一个有3个字符长的单词时,它会把1加到一个bin中。c[i]将在第一个元素上为您提供3,但是由于列表是0索引的(列表从0开始并从0向上),您需要进行补偿,因此-1。所以我们看到了counts[c[i]-1],现在它变得更有意义了,对吧?

counts[c[i]-1] # this means counts[3-1] which means go find the bin corresponding to counts[2]

# ---v   this one
[0,0,0,0,0]

+=1简单的意思是“在已经存在的东西上加1”。

Python会很高兴地遍历它并给出答案。

类似于:

>>> words = [len(word) for word in "this is a sentence".split()]
>>> words.sort()
>>> words
[1, 2, 4, 8]

相关问题 更多 >