【问题标题】:Python comparing two lists and filtering itemsPython比较两个列表和过滤项目
【发布时间】:2018-05-01 08:18:34
【问题描述】:

我想做一些词过滤(仅提取“白名单”中存在的“关键字”列表中的项目)。

到目前为止,这是我的代码:

whitelist = ['Cat', 'Dog', 'Cow']
keyword = ['Cat, Cow, Horse', 'Bird, Whale, Dog', 'Pig, Chicken', 'Tiger, Cat']
keyword_filter = []
 
for word in whitelist:
    for i in range(len(keyword)):
        if word in keyword[i]:
            keyword_filter.append(word)
        else: pass

我想删除除“Cat”、“Dog”和“Cow”(在 'whitelist') 以便结果('keyword_filter' 列表)如下所示:

['Cat, Cow', 'Dog', '', 'Cat']

但是,我得到的结果是这样的:

['Cat', 'Cat', 'Dog', 'Cow']

如果您能给我一些建议,我将不胜感激。

【问题讨论】:

  • 是的,我需要按顺序排列结果 ['Cat, Cow', 'Dog', '', 'Cat']。抱歉没有提及。
  • @Jean-FrançoisFabre 那行不通。单词是用逗号分隔的字符串 :)

标签: python list filtering


【解决方案1】:

您需要拆分列表中的字符串,并检查拆分中的单词是否包含在白名单中。然后过滤后重新加入白名单中的所有单词:

whitelist = {'Cat', 'Dog', 'Cow'}
filtered = []
for words in keyword:
    filtered.append(', '.join(w for w in words.split(', ') if w in whitelist))

print(filtered)
# ['Cat, Cow', 'Dog', '', 'Cat']

最好将whitelist 设为一个集合,以提高每个单词的查找性能。

您也可以使用re.findall查找所有部分包含在白名单中的每个单词匹配字符串,然后在找到匹配项后重新加入

import re

pattern = re.compile(',?\s?Cat|,?\s?Dog|,?\s?Cow')
filtered = [''.join(pattern.findall(words))) for words in keyword]

【讨论】:

  • 非常感谢。我真的很感谢你的帮助。也感谢所有其他人。你们是最棒的!
【解决方案2】:

试试这个..

whitelist = ['Cat', 'Dog', 'Cow']
keyword = ['Cat, Cow, Horse', 'Bird, Whale, Dog', 'Pig, Chicken', 'Tiger, Cat']
keyword_filter = []

for word in keyword:
    whitelistedWords = []
    for w in word.split(', '):
        if w in whitelist:
            whitelistedWords.append(w)
            #print whitelistedWords
    keyword_filter.append( ', '.join(whitelistedWords) )

print keyword_filter

【讨论】:

    【解决方案3】:

    简单的列表理解:

    whitelist = ['Cat', 'Dog', 'Cow']
    keyword = ['Cat, Cow, Horse', 'Bird, Whale, Dog', 'Pig, Chicken', 'Tiger, Cat']
    keyword_filter = [', '.join(w for w in k.split(', ') if w in whitelist) for k in keyword]
    
    print(keyword_filter)
    

    输出:

    ['Cat, Cow', 'Dog', '', 'Cat']
    

    【讨论】:

      【解决方案4】:

      由于您想保留关键字列表的顺序,因此您需要将其作为最外层循环。

      for phrase in keyword:

      现在您需要将短语拆分为其实际单词并确定这些单词是否在白名单中。然后你需要把这些词重新组合在一起。您可以在一行中完成此操作。

         filtered = ", ".join(word in phrase.split(", ") if word in whitelist)
      

      细分:phrase.split(", ") 为您提供原始字符串中以“,”分隔的字符串列表——即您关心的单词。 word in ... if word in whitelistlist comprehension。它将返回... 中每个单词的列表,在本例中为phrase.split,满足word in whitelist 条件。最后,", ".join(...) 为您提供了一个字符串,该字符串由列表 ... 中的每个元素组成,由“、”连接。

      最后,您需要将新过滤的字符串放入您的过滤字符串列表中。

         keyword_filter.append(filtered)
      

      作为旁注,我同意其他人的观点,即您应该使用set 来收集列入白名单的单词。它具有更快的查找时间。但是,对于像这个示例这样的极少单词列表,您不会注意到性能差异。

      【讨论】:

        【解决方案5】:

        你可以使用正则表达式:

        import re
        
        whitelist = ['Cat', 'Dog', 'Cow']
        keyword = ['Cat, Cow, Horse', 'Bird, Whale, Dog', 'Pig, Chicken', 'Tiger, Cat']
        keyword_filter = []
        
        for words in keyword:
            match = re.findall('(' + r'|'.join(whitelist) + ')[,\s]*', words)
            keyword_filter.append(', '.join(match))
        print(keyword_filter)
        

        【讨论】:

          猜你喜欢
          • 2021-03-11
          • 1970-01-01
          • 2020-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多