Python - 仅打印少于五个字符的单词

时间:2012-10-05 18:03:43

标签: python split definition

这个问题与我的教育有关,我希望尽可能详细地向你提供任何帮助 - 我不想复制粘贴代码并将其交给我。:)

任务很简单 - 创建一个名为writeshort(txt)的定义,取一串单词,只打印少于五个字符的单词。现在我已经完成了这个,但事情是特定sais的任务使用定义。我在这里失败了。

没有定义的代码,有效:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

string = raw_input(”Write a few lines: ”)
txt = string.split()
result = []

for words in txt:
    if len(words) > 4:
        continue
    result.append(words)

print ', '.join(result), ”have less than five letters!”

现在看起来不错,打印没有任何令人讨厌的['']。但是这些定义呢? 我尝试了几件事,这是最新的,但它只打印少于五个字母的第一个单词,而忽略其余的单词:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

string = raw_input(”Write a few lines: ”)
txt = string.split()

def writeshort(txt):
    for txt in txt:
        if len(txt) > 4: #Yes I know its a 4, but since it counts 0...
            continue
        return txt

print writeshort(txt), "have fewer letters than five!"

我感谢任何帮助。感谢您花时间帮我学习Python!

3 个答案:

答案 0 :(得分:7)

是的,因为writeshort中的循环在找到一个短字时会遇到return语句并立即返回。

如果您需要writeshort中的所有简短字词,则需要先在列表中收集,然后最后返回列表。也许是这样的:

def writeshort(txt):
    wordlist = []
    for item in txt:
        if len(item) > 4:
            continue
        wordlist += [item] # or wordlist.append(item) as in your first snippet
    return wordlist

整个功能可以用一行代码和更多pythonic代码替换:

[word for word in txt if len(word) <= 4]

你写过for txt in txt:,这很奇怪。它将执行预期的操作(对原始txt中的每个项执行),但txt将在每次迭代中更改为列表中的项。

答案 1 :(得分:1)

你的问题是return txt;在for循环期间,Python第一次点击该语句时,它将返回txt并且完全停止调用writeshort

为什么不像你的旧代码一样,将它们收集到一个列表然后使用它?

def writeshort(txt):
    result = []
    for word in txt:
        if len(word) > 4:
            continue
        result.append(word)
    return result

(我将令人困惑的for txt in txt更改为for word in txt,但不会覆盖名为txt的旧变量。)

此外,您对if len(word) > 4的评论让我觉得您可能会对此感到有些困惑:len不会“计数0” - 您可能正在考虑索引,从0开始你需要> 4的原因是因为它检查它大于 4,即5或更多。你也可以说>= 5


虽然我们正在努力,为什么不让你的代码更好?

不要在你的循环中使用continue,而是可以通过否定条件直接做到这一点:

result = []
for word in txt:
    if len(word) < 5:
        result.append(word)

顺便说一句,这种将事物收集到列表中的模式实际上非常普遍,以至于Python有一个特殊的语法处理它(以及一些更一般的情况),称为列表理解:

def writeshort(txt):
    return [word for word in txt if len(word) < 5]

答案 2 :(得分:0)

一些想法:

1)你正在使用txt作为你正在循环的集合和当前元素:

for txt in txt:

这最好让人感到困惑。尝试

for word in txt:

2)这里的主要问题是,一旦找到一个短于五个字符的单词,就会从函数返回。您应该查看保存这些单词的列表,然后在检查txt中的每个单词后返回整个列表。

def writeshort(txt):
    shortwords = []
    for word in txt:
        if len(txt) > 4: 
            continue
        shortwords += [word]
    return shortwords