Python 3.3.2-创建单词长度列表

Python 3.3.2-创建单词长度列表,python,python-3.x,count,Python,Python 3.x,Count,我有一串带标点符号的单词,比如说 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,我需要将每个单词的长度计算到一个列表中,列表的长度是最长的单词。清单的内容如下: lengthLis

我有一串带标点符号的单词,比如说

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, ...]
因此,对于
字符串
,它将是:

lengthList = [0, 0, 4, 2, 3, 1]
不幸的是,我很难做到这一点。有人能提供帮助吗

谢谢。

类似于:

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

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

不要使用变量名,如
列表
字符串
,因为在
列表
的情况下,这是您正在制作的类型的名称。事实上,这就是您创建所创建类型的空实例的方式:

something=list()       # this is an empty 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)
表示在每个空格中列出一个
0
s的列表,并使其重复
c
max
。因此,这将使用最长的单词,在本例中是6个字母的单词“真的”,并将列表设为6个元素。这将确保我们有一个列表,其中包含我们遇到的每个长度单词的空格

for i in range(len(c)):
  counts[c[i]-1]+=1
哦,孩子,现在我们在做饭。请注意,我们正在迭代列表
c
,因此我们通过列表得到的每一项都是相应单词的长度:

  • 第一个元素将是
    3
    ,对应于
    Did
  • 第二个元素将是
    3
    ,与
    对应
  • 最后一个元素将是
    5
    ,对应于
    fence
这就是
c[i]
的意义,但是
计算[c[i]-1]
的是什么?好的,
counts
将为您找到的每个长度添加
1
,因此当一个单词有3个字符长时,它将向一个bin添加
1
c[i]
将在第一个元素上为您提供
3
,但由于列表是0索引的(列表从0开始,然后从0开始上升),因此需要进行补偿-因此
-1
。所以我们看到,
计数[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将很高兴地遍历它并给出答案

string = 'Did the quick brown fox really jump over the fence'
L = string.split()
D = {}    
res = []

for w in L: #store words lenght as keys and repetition as values 
    if len(w) in D:
        D[len(w)] += 1 #increase by one if had seen word with same lenght.
    else:
        D[len(w)]  = 1 #initialize hash with value one if had not seen word with that length  before. 

res = [D.get(x, 0) for x in range(1, max(D.keys()) + 1)]

print(res)
#[0, 0, 4, 2, 3, 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)

我以这些名字为例;我的实际程序实际上并没有使用这些。尽管你做出了许多错误的假设(我刚开始使用Python,这是为了一项作业,我目前的编码水平等等),但这篇文章仍然提供了大量信息,我会使用它。这是一个很好的答案。但是,您可以不使用
计数器中的方括号
调用。也就是说,使用生成器表达式而不是列表。对于像示例这样的短文本,差异很小,但是对于大文本(数千个单词),生成器表达式将使用更少的内存。我不知道它会起作用。它为什么有效
Counter(len(words)表示Data.split()中的单词)
在这种情况下,Counter是否将输入视为元组?与大多数容器一样,
Counter的构造函数接受任何iterable对象。因此,生成器表达式工作得很好,因为迭代是生成器的关键。很不清楚您是在尝试“查找句子中最长单词的长度”还是“查找不同长度的单词在句子中出现的次数”——比如“两个单词长度为1,四个单词长度为2,一个单词长度为5”? 您的上述解决方案仅在第一种情况下有效;在这种情况下,它也是不完整的。请不要只发布代码作为答案,还包括解释您的代码的作用以及它如何解决问题。带有解释的答案通常质量更高,更容易吸引选票。
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)
original_str = "This is a demonstration"
num_words_list = list(original_str.split())
num_words_list = [len(i)for i in num_words_list]