【问题标题】:How to iterate through a list of strings (i.e a sentence) and check if it has a specific word in it?如何遍历字符串列表(即句子)并检查其中是否包含特定单词?
【发布时间】:2020-11-16 16:58:45
【问题描述】:

所以问题是创建一个函数,它接受一个文档列表(每个文档都是一个字符串)和一个关键字。它应该将索引值列表返回到包含关键字的所有文档的原始列表中。

示例(结果应为[0]):

doc_list = ["The Learn Python Challenge Casino.", "They bought a car", "Casinoville"]
word_search(doc_list, 'casino')

我尝试了列表推导,但我不知道哪里出错了。这是我的代码:

def word_search(doc_list, keyword):
    indices=[]
    for i, doc in enumerate(doc_list):
        indices =[i for word in doc.split(" ") if word.lower().strip(".,")== keyword.lower()]
        return indices

【问题讨论】:

  • 您遇到错误了吗?
  • 您通过indices = [ i for ...] 在每一步重写索引。要检查单词是否在文档中并添加索引,您可以执行if keyword.lower() in [word.strip(".,").lower() for word in doc.split()]: indices.append(i)
  • @Cfreak no 我的输出显示一个空列表

标签: python


【解决方案1】:

您的工作代码:

def word_search(doc_list, keyword):
    indices=[]
    for i, doc in enumerate(doc_list):
        if len([i for word in doc.split() if word.lower().strip(".,")== keyword.lower()])>0:
            indices.append(i)
    return indices

适合您目的的替代正则表达式代码

import re
def word_search_re(doc_list, keyword):
    indices=[]
    keyword='\\b'+keyword+'\\b'
    for i, doc in enumerate(doc_list):
        doc=re.sub('(\.|,)+',"",doc)
        if re.search(keyword,doc,re.IGNORECASE):
            indices.append(i)
    return indices

【讨论】:

    【解决方案2】:

    在每次迭代中,您都会覆盖索引的值 + return 语句位于错误的位置,因此它实际上总是在检查第一句后返回。

    def word_search(doc_list, keyword):
        indices=[]
        for i, doc in enumerate(doc_list):
            sentence_words = [word.strip(".,")for word in doc.lower().split(" ")]
            if keyword in sentence_words:
                indices.append(i)
        return indices
    

    【讨论】:

      【解决方案3】:

      这将为您提供与doc_list 的每个项目匹配的索引,并满足区分大小写:

      def word_search(word_list, search):
          search = search.lower()
          def trim_and_lower(s):
              return s.split(".")[0].lower()
      
          # normalize string
          str_list = map(trim_and_lower, doc_list)
          indices = [[i for i, c in enumerate(ln.split(" ")) if c == search] for ln in str_list]
          return list(indices)
      

      【讨论】:

        【解决方案4】:

        您的代码作为列表理解单行:

        def word_search(doc_list, keyword):
            return [i for i, doc in enumerate(doc_list) if any(keyword.lower() == w.lower().strip(".,") for w in doc.split(" "))]
            
        

        这是一个几乎是单行的,仍然可以阅读,使用map。在这种情况下,真正的单线是不可维护的。

        doc_list = ["The Learn Python Challenge Casino.", "They bought a car", "Casinoville"]
        def word_search(doc_list, keyword):
            def find_in_doc(doc: str):
                return any(keyword.lower() == w.lower().strip(".,") for w in doc.split(" "))
        
            return [i for i, v in enumerate(map(find_in_doc, doc_list)) if v]
        
        print(word_search(doc_list, "casino"))
        

        [0]

        【讨论】:

          【解决方案5】:
          doc_list = ["The Learn Python Challenge Casino.", "They bought a car", "Casinoville"]
              
          def word_search(doc_list, keyword):
            values = []
            for key,value in enumerate(doc_list):
              sentence_words = [word.strip(".,")for word in value.lower().split(" ")]
              if keyword in sentence_words:
                values.append(key)
            return values
          print(word_search(doc_list,"casino"))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-05-20
            • 2013-12-23
            • 1970-01-01
            相关资源
            最近更新 更多