【问题标题】:for loop only returning the last word in a list of many wordsfor 循环仅返回许多单词列表中的最后一个单词
【发布时间】:2012-03-27 01:32:55
【问题描述】:
for word in wordStr:
    word = word.strip()
print word

上面的代码在分析一个包含数千个单词的.txt时,为什么只返回.txt文件中的最后一个单词?我需要做什么才能让它返回文本文件中的所有单词?

【问题讨论】:

  • 这不会返回任何东西;它打印一些东西。你用return返回东西。

标签: python


【解决方案1】:

因为您在循环中覆盖了word,这并不是一个好主意。您可以尝试以下方法:

wordlist = ""
for word in wordStr:
    wordlist = "%s %s"%(wordlist,word.strip())
print wordlist[1:]

这是相当原始的 Python,我相信有一种更 Pythonic 的方式来处理列表推导和所有新奇的东西 :-) 但我通常更喜欢可读性。

这样做是在一个单独的字符串中维护一个单词列表,然后将每个剥离的单词添加到该列表的末尾。末尾的[1:] 只是为了去掉第一个单词添加到空单词列表末尾时添加的初始空间。

随着字数的增加,它最终会受到影响,因为将内容附加到字符串的末尾不如其他数据结构最佳。然而,即使是多达 10,000 个单词(去掉了打印),它仍然很好不到一秒的执行时间。

在 50,000 字时,它变得很明显,在我的盒子上需要 3 秒。如果您要处理这种数量,您可能会选择真正的基于列表的解决方案,例如(与上述相同,但具有不同的底层数据结构):

wordlist = []
for word in wordStr:
    wordlist.append (word.strip())
print wordlist

完成我的整个词典文件大约需要 0.22 秒(没有打印),大约 110,000 个单词。

【讨论】:

  • 这不是维护一个列表...您正在重复构建新字符串,其中包含到目前为止看到的所有单词,并用空格分隔。构建每个字符串是 O(n),所以总的来说你是 O(n^2)。这是一种非常低效的方法来完成一个非常简单的任务;在我看来,它也比使用列表推导等“新奇东西”的直接方法复杂得多,可读性也差。
  • 这是你的意见,@Ben,你有权这样做。这就是为什么我说“类似”并提到其他东西的原因。问题中没有任何内容表明需要一个列表,只是他们想要返回的话。至于性能,问题是数千个单词,它在大约 0.32 秒内完成 10K。一旦达到 50K,它会在大约 3 秒后变得明显,但这取决于字数。
  • 不,但是您声明您正在维护一个列表,这并不是您的代码正在执行的操作。虽然非正式地很好,但告诉那些显然仍然是 Python 初学者(如果不是初学者程序员)的人可能不是一件好事。我真的很惊讶有人会发现这比明显的 for 循环或列表理解更具可读性,但是是的,可读性肯定不是一个客观的主题。
  • 啊,我现在知道“列表”是从哪里来的,我的误解。我实际上并不是指正式 Python 意义上的列表,只是单词列表(在列表、数组或树中,或者在这种情况下是字符串)。我会澄清的。
【解决方案2】:

要打印wordStr 中的所有单词(假设wordStr 是某种可迭代的返回字符串),您可以简单地编写

for word in wordStr:
    word = word.strip()
    print word # Notice that the only difference is the indentation on this line

Python 关心缩进,因此在您的代码中,打印语句位于循环之外并且只执行一次。在修改后的版本中,打印语句在循环内,每个单词执行一次。

【讨论】:

  • @user1294377:实际上,如果您只想打印,这可能是比我更好的解决方案。它不会占用列表的大量存储空间。
【解决方案3】:

那是因为变量word是当前单词,完成文件后是最后一个:

def stuff():
    words = []
    for word in wordStr:
        words.append(word.strip())
    print words
    return words

【讨论】:

    【解决方案4】:

    List comprehensions 应该让您的代码更时髦、更 Python 化。

    wordStr = 'here are some words'
    print [word.strip() for word in wordStr.split()]
    

    返回

    ['here', 'are', 'some', 'words']
    

    【讨论】:

      【解决方案5】:

      如果您不知道为什么您的示例中的代码仅“返回”最后一个单词(实际上它没有返回任何内容,而是打印一个单词),那么恐怕这里没有什么可以帮助您很多。

      我知道这听起来充满敌意,但我不想这样。从您的问题来看,您似乎在扔一些 Python 知识,而对 Python 编程的基础知识却很少真正了解。

      现在不要误会我的意思,尝试新事物是一项很棒的早期学习活动,而有一项任务来激励您的学习也是一种很好的方式。所以我不想告诉你停下来!但是,无论您是想学习编程还是只是有一项需要您编写程序的任务,如果不了解基础 导致您的示例无法按照您的意愿执行的潜在问题。

      我们可以在这里告诉你:

      for word in wordStr:
          word = word.strip()
      print word
      

      是一个程序,大致意思是“对于wordStr中的每个word,将word绑定到word.strip()的结果;然后打印word的内容”,而你想要的很可能:

      for word in wordStr:
          word = word.strip()
          print word
      

      这是一个程序,大致意思是“对于wordStr中的每个word,将word绑定到word.strip()的结果,然后打印word”。这解决了你的直接问题。但是你会遇到更多性质非常相似的问题,如果不了解基础知识,你将无法看到它们都是“同类”,你只会结束在这里提出更多问题。

      您需要对 Python 中的变量、语句、循环等如何工作有一个基本的了解。如果您继续尝试在此处应用代码并提出问题,您可能最终会有所收获。但是 Stack Overflow 并不是获得这种理解的最有效的资源。更好的选择是给自己找一本好书或教程(http://docs.python.org/tutorial/ 有官方教程)。

      肥皂盒到此为止。

      【讨论】:

        猜你喜欢
        • 2021-04-20
        • 1970-01-01
        • 1970-01-01
        • 2021-08-14
        • 1970-01-01
        • 1970-01-01
        • 2014-01-19
        • 1970-01-01
        • 2014-07-06
        相关资源
        最近更新 更多