0

我以前从未使用过stackoverflow,我通常会留在数学和物理部分。我是反应堆物理学家,而不是程序员,这实际上是我玩 Python 2 的第一周,所以请不要责备我。

我应该使用 for 循环创建一个列表“wordLenLi”,其中包含一个小段落中单词的长度。短段落在批处理文件中

这是我尝试过的。我也尝试过使用 append() 方法。这本小书没有做太多的正义。

st = '''April is the crueles month, breeding
Lilacs out of the dead land, mixing
Memory and desire, stirring
Dull roots with spring rain.'''

x = st.upper()

wordLi = x.split(' ')

for n in wordLi:    
    z = len(n)
    WordLenli = z.split()
    print wordLenLi
4

2 回答 2

2

下面是一个列表理解。列表推导本质上是编写 for 循环的强大速记。一个基本的列表推导式采用[expr for variable in iterable]. 它遍历 中的每个值iterable,将其分配给variable然后将结果存储expr在列表中。所以

WordLenLi = [len(word) for word in st.split()]
print(WordLenLi)

生产

>>> 
[5, 2, 3, 7, 6, 8, 6, 3, 2, 3, 4, 5, 6, 6, 3, 7, 8, 4, 5, 4, 6, 5]

作为一个 for 循环,它看起来像这样

WordLenLi = []
for word in st.split(): #for each word in a list of words
    WordLenLi.append(len(word)) #insert the length of the word into WordLenLi

Alternativley,作为演示:

WordLenLi = [(word,len(word)) for word in st.split()]
print(WordLenLi)
>>> 
[('April', 5), ('is', 2), ('the', 3), ('crueles', 7), ('month,', 6), ('breeding', 8), ('Lilacs', 6), ('out', 3), ('of', 2), ('the', 3), ('dead', 4), ('land,', 5), ('mixing', 6), ('Memory', 6), ('and', 3), ('desire,', 7), ('stirring', 8), ('Dull', 4), ('roots', 5), ('with', 4), ('spring', 6), ('rain.', 5)]

你也可以让它比第一个理解更短:

WordLenLi = map(len,st.split())

另外,根据乔恩克莱门特的建议,你想st.split()用这样的东西代替:

re.findall(r'\b[\w\d%s]+\b' % string.punctuation,st)

这将要求您通过导入restring模块import re,string

于 2013-05-09T10:36:56.687 回答
0

所以我喜欢 HennyH 的答案,但是为了让你不会觉得列表推导是唯一可能的答案,我们也有:

for word in paragraph.split() : 
    print(word.len())  

原来的问题是:

z = len(n)
WordLenli = z.split()

您试图“拆分”一个数字,就好像它是一个字符串一样。一般的教训是:

  • 减少移动部件的数量可以减少潜在的错误。
  • 它有助于记住每个命名对象是什么类型的东西。

我认为这些原则在物理学中和在编程中一样有效,但是当麻烦开始时很容易忽略它们。

于 2013-05-09T10:55:06.093 回答