【问题标题】:How do i read, append and sort all the words of a text file in python?如何在 python 中读取、附加和排序文本文件的所有单词?
【发布时间】:2020-09-11 03:07:09
【问题描述】:

打开文件romeo.txt 并逐行读取。对于每一行, 使用split() 函数将该行拆分为单词列表。这 程序应该建立一个单词列表。对于每行检查的每个单词 查看单词是否已经在列表中,如果没有,则将其附加到 列表。程序完成后,排序并打印结果单词 按字母顺序排列。

http://www.pythonlearn.com/code/romeo.txt

这是我的代码:

fname = raw_input("Enter file name: ")
fh = open(fname)
for line in fh:
     for word in line.split():
          if word in line.split():
               line.split().append(word)
          if word not in line.split():
               continue
          print word

由于某种原因,它只返回最后一行的最后一个单词。

【问题讨论】:

  • 你希望line.split().append(word) 做什么,究竟是什么?
  • 我测试了你的代码:它打印出每一行的每个单词,正如我所期望的那样。当您致电line.split() 时,您会期待什么?您希望哪个条件(“...中的单词”或“不在...中的单词”)是正确的?
  • 我误解了这个问题,还是说文件中的每一行,将行拆分为单词并检查结果列表中的每个单词是否在所述列表中?这不是多余的,因为它总是正确的吗?将单词添加到列表末尾的目的是什么?那不是两次上榜了吗?

标签: python python-2.7


【解决方案1】:

在循环的顶部,添加一个列表,您将在其中收集您的单词。现在你只是在丢弃一切。

您的逻辑也是相反的,您正在丢弃应该保存的单词。

words = []
fname = raw_input("Enter file name: ")
fh = open(fname)
for line in fh:
     for word in line.split():
          if word not in words:
               words.append(word)
fh.close()

# Now you should sort the words list and continue with your assignment

【讨论】:

    【解决方案2】:

    尝试以下操作,它使用set() 来构建唯一的单词列表。每个单词也是小写的,因此“The”和“the”被视为相同。

    import re
    
    word_set = set()
    re_nonalpha = re.compile('[^a-zA-Z ]+')
    
    fname = raw_input("Enter file name: ")
    
    with open(fname, "r") as f_input:
        for line in f_input:
            line = re_nonalpha.sub(' ', line)  # Convert all non a-z to spaces
    
            for word in line.split():
                word_set.add(word.lower())
    
    word_list = list(word_set)
    word_list.sort()
    print word_list
    

    这将显示以下列表:

    ['already', 'and', 'arise', 'bits', 'breaks', 'but', 'east', 'envious', 'fair', 'grief', 'has', 'is', 'it', 'juliet', 'kill', 'light', 'many', 'moon', 'pale', 'punctation', 'sick', 'soft', 'sun', 'the', 'this', 'through', 'too', 'way', 'what', 'who', 'window', 'with', 'yonder']
    

    【讨论】:

    • 我认为正则表达式是多余的。 OP 正在使用的文件已经用空格分隔,没有标点符号:)
    • 同意,但我记得一个几乎相同的问题和文字,而且那个地方到处都有微妙的标点符号,这让事情变得很糟糕。
    【解决方案3】:
    sorted(set([w for l in open(fname) for w in l.split()])) 
    

    【讨论】:

      【解决方案4】:

      我想你误解了line.split() 的作用。 line.split() 将返回一个列表,其中包含字符串 line 中的“单词”。在这里,我们将“单词”解释为“由空格字符分隔的子字符串”。所以如果line 等于"Hello, World. I <3 Python"line.split() 将返回列表["Hello,", "World.", "I", "<3", "Python"]

      当您编写for word in line.split() 时,您正在遍历该列表的每个元素。所以条件word in line.split() 将永远为真!您真正想要的是“您已经遇到过的单词”的累积列表。在程序的顶部,您将使用DiscoveredWords = [] 创建它。然后你会检查每一行中的每个单词

      if word not in DiscoveredWords:
          DiscoveredWords.append(word)
      

      明白了吗? :) 现在看来你是 Python 的新手(顺便说一句,欢迎来玩)我会这样写代码:

      fname = raw_input("Enter file name: ")
      with open(fname) as fh:
          words = [word for line in fh for word in line.strip().split()]
      words = list(set(words))
      words.sort()
      

      让我们快速浏览一下这段代码,以便您了解发生了什么:

      with open(fname) as fh 是一个方便记住的技巧。它允许您确保您的文件被关闭!一旦 python 退出 with 块,它将自动为您关闭文件:D

      words = [word for line in fh for word in line.strip().split()] 是另一个方便的技巧。这是获取包含文件中所有单词的列表的更简洁的方法之一!我们告诉 python 通过获取文件中的每一行 (for line in fh) 以及该行中的每个单词 (for word in line.strip().split()) 来创建一个列表。

      words = list(set(words)) 将我们的列表转换为set,然后再转换为list。这是一种快速删除重复项的方法,因为 python 中的 set 包含唯一元素。

      最后我们使用words.sort()对列表进行排序。

      希望这对您有所帮助和启发:)

      【讨论】:

        【解决方案5】:
        words=list()
        fname = input("Enter file name: ")
        fh = open(fname).read()
        fh=fh.split()
        
        for word in fh:
            if word in words:
                continue
            else:
                words.append(word)
        words.sort()
        print(words)
        

        【讨论】:

        • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的答案添加解释并说明适用的限制和假设。
        猜你喜欢
        • 2016-06-30
        • 2021-02-11
        • 1970-01-01
        • 1970-01-01
        • 2015-07-20
        • 2017-04-17
        • 2016-01-05
        • 1970-01-01
        • 2015-06-09
        相关资源
        最近更新 更多