【问题标题】:return last word in a file that starts with capital letter返回以大写字母开头的文件中的最后一个单词
【发布时间】:2019-05-29 12:27:36
【问题描述】:

我正在尝试制作一个简单的脚本,该脚本会为最后一个以大写字母开头的单词搜索指定的 .txt 文件并返回它。如果没有以大写字母开头的单词,则返回一个空字符串。

这是我迄今为止尝试过的:

def find_last_capitalised(file_name):
    with open(file_name) as wordfile:
        text_str = wordfile.read()
        word_list = text_str.split()
        upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        for word in word_list:
            if word.rfind(upper):
                return word
            else:
                return " "

但这不起作用。

我也试过这个:

    with open(file_name) as wordfile:
        text_str = wordfile.read()
        word_list = text_str.split()
        for word in word_list:
            if word_list[-1].isupper():
                return word_list[-1]
            else:
                return " "

有什么帮助吗?

【问题讨论】:

  • 你能提供一个样本和预期的输出吗?
  • 您的第二次尝试是查看最后一个 word_list 元素,而不是 word,但您是在寻找单词中的最后一个字母还是第一个字母?

标签: python


【解决方案1】:

其他人为您提供了各种方法来完成您的任务。我想解释一下为什么您的第一种方法不能按预期工作:

upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
if word.rfind(upper):

str.rfind 方法正在寻找word 中最后一个子字符串ABCDEFGHIJKLMNOPQRSTUVWXYZ 的位置。我猜你的话不包含这样的子字符串,在这种情况下.rfind 返回-1,根据 Python 的规则计算为True(因为它不为零),所以它几乎可以捕获任何单词(它将给出0False 仅用于以ABCDEFGHIJKLMNOPQRSTUVWXYZ 开头且仅包含单个ABCDEFGHIJKLMNOPQRSTUVWXYZ 的单词)

【讨论】:

  • 欣赏这个!
【解决方案2】:

首先,您的算法将返回第一个大写单词,而不是最后一个,因此需要对逻辑进行一些更改。还提供了检查单词是否大写的最简单方法:

def find_last_capitalised(file_name):
    with open(file_name) as wordfile:
        text_str = wordfile.read()
        word_list = text_str.split()
        last_cap_word = " "
        for word in word_list:
            if word[0].isupper():
                last_cap_word = word

        return last_cap_word

【讨论】:

  • 此刻脑子里放了个屁。我为什么要放[0]?它有效,但不知道为什么我觉得自己很笨哈哈
  • 这是因为您的单词是一个字符串,而word[0] 采用了字符串中的第一个元素(字母、字符)。例如,如果您有word='puppy',那么word[0] 将是p.isupper() 只检查字符是否为大写。
【解决方案3】:

看来你需要reversed

例如:

def find_last_capitalised(file_name):
    with open(file_name) as wordfile:
        text_str = wordfile.read()
        word_list = text_str.split()
        for word in reversed(word_list):   #reversed
            if word[0].isupper():
                return word
    return " "

【讨论】:

    【解决方案4】:

    我做了这样的事情。

    import re
    pattern = "[A-Z][a-zA-Z]+"
    
    with open('input.txt', 'r') as file:
      for el in reversed(file.readlines()):
        res = re.findall(pattern, el)
        if res:
          print(res[-1]) 
    
    

    【讨论】:

      【解决方案5】:
      def find_last_capitalised(word_list):
          lastCapWord = " "
          for word in word_list:
              print(word)
              if word[0].isupper():
                  lastCapWord = word
          print('lastCapWord:', lastCapWord)
          return lastCapWord
      
      
      word_list = ['this', 'is', 'A', 'test']
      find_last_capitalised(word_list)
      

      你的算法有点不对劲。它不会遍历列表中的每个单词,而是根据它看到的第一个单词返回。假设你让你的单词列表变成一个数组,下面的代码应该可以正常工作。

      【讨论】:

        【解决方案6】:

        您需要在第一次失败时返回" "。这就是为什么你没有得到预期的结果。

        def find_last_capitalised(file_name):
            with open(file_name) as wordfile:
                text_str = wordfile.read()
                word_list = text_str.split()
                for word in reversed(word_list):
                    if word[0].isupper():
                        return word
                return ""
        

        但是,如果您的文件更大,您可能希望以相反的顺序读取文件。这将使您更轻松地找到所需内容。

        import os
        
        def find_last_capitalised(file_name):
            with open(file_name) as wordfile:
                wordfile.seek(0, os.SEEK_END)
                position = wordfile.tell()
                word = ''
                while position >= 0:
                    qfile.seek(position)
                    next_char = qfile.read(1)
                    if next_char == " ":
                        if word[0].isupper():
                            return word
                        word = ''
                    else:
                        word += next_char
                    position -= 1
                return ""
        

        我建议使用类似的方法来解决您的问题。

        【讨论】:

          【解决方案7】:

          您可以尝试使用reversedis_upper 关键字:

          def find_last_capitalised(file_name):
              with open(file_name) as wordfile:
                  text_str = wordfile.read()
                  word_list = text_str.split()
                  word_list = reversed(word_list)
                  for word in word_list:
                      if word[0].isupper():
                          return word
          
          print(find_last_capitalised("demo.txt"))
          

          【讨论】:

          • @ThierryLathuille : 我把名单倒过来了 : word_list = reversed(word_list)
          • 你为什么要在return之后break
          【解决方案8】:
          def find_last_capitalised(file_name):
          with open(file_name) as wordfile:
              text_str = wordfile.read()
              word_list = text_str.split(" ")
              upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
              for word in reversed(word_list):
                  if upper.rfind(word[0]) >= 0:
                  return word
              return " "
          

          请尝试使用上面的代码...如果它不起作用,请在这里告诉我。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-10-05
            • 1970-01-01
            • 2022-01-22
            • 1970-01-01
            • 2022-11-23
            • 2016-10-22
            • 1970-01-01
            • 2021-12-18
            相关资源
            最近更新 更多