【问题标题】:Python - Print only words with less than five characters [closed]Python - 仅打印少于五个字符的单词[关闭]
【发布时间】:2012-10-05 18:03:42
【问题描述】:

这个问题与我的教育有关,我希望你能提供尽可能详细的帮助——我不想复制粘贴代码并交出来。:)

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

没有定义的代码,有效:

#!/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!

【问题讨论】:

  • for txt in txt???并且 len() 从 1 开始计数,而不是 0
  • 但是如果我写一个 5,它会因为某种原因计算五个字母长的单词。
  • 感谢大家的帮助!我让它工作了! :)

标签: python split definition


【解决方案1】:

是的,因为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 将在每次迭代中更改为列表中的一个项目。

【讨论】:

  • 非常感谢!虽然我不得不在某处使用[],但它不适合......是的,我同意txt for txt 看起来很奇怪,但我读了一些其他例子,他们写了for x in txt,后来声明@987654331 @,认为它做了同样的事情。
【解决方案2】:

你的问题是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) &gt; 4 的评论让我觉得您可能对此有些困惑:len 不“计数 0”——您可能正在考虑索引,它从 0 开始。您的原因是需要&gt; 4 是因为它检查它是否大于 4,即5 或更多。你也可以说&gt;= 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]

【讨论】:

  • 谢谢,我不知道!好吧,我们每天都学到新东西。感谢您的快速答复!
【解决方案3】:

几个想法:

1) 您将 txt 用作循环的集合和当前元素:

for txt in txt:

这在 BEST 会令人困惑。试试

for word in txt:

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

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

【讨论】:

  • 应该是shortwords += [word],否则尝试将str附加到list时会引发异常。
  • 感谢您的关注。这种行为是 Python3 特有的吗?在 Python 2.7 中,它会将字符串附加为字符序列,而不是引发异常 但这仍然不是我的意思 :)
  • 哦,对了,我忘了str也是iterable,可以附加到list,另一个iterable。而且我不知道 Python 3.0 会发生什么 :)
  • 感谢您的回复,顺便说一句,我正在使用 Python3!
  • @AndreasBizzozero 你确定吗?在 Python 3 中你不能写 print writeshort(txt), "have fewer letters than five!",你必须写 print(writeshort(txt), "have fewer letters than five!")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 2018-05-06
  • 1970-01-01
相关资源
最近更新 更多