Python比较两个列表和过滤项目

时间:2017-11-17 14:12:29

标签: python list filtering

我是Python的初学者,想要进行一些文字过滤(仅提取'白名单中存在的关键字'列表中的项目。)

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

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

除了“猫”,“狗狗”和“牛奶”之外,我想删除所有字词。\ n' (在...中 '白名单')以便结果(' keyword_filter'列表)如下所示:

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

然而,我得到的结果是这样的:

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

如果你能提出一些建议我真诚地感激。

5 个答案:

答案 0 :(得分:3)

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

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]

答案 1 :(得分:1)

试试这个..

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

答案 2 :(得分:1)

简单列表理解:

"{"chart":{"animation":false,"backgroundColor":"rgba(255, 255, 255, 0.0)","type":"bar"},"credits":{"enabled":false},"xAxis":{"categories":["\u0027Alta \u0027","\u0027Gratr\u0027","\u0027IDV\u0027","\u0027BSV\u0027","\u0027Adhes\u0027"]},"yAxis":{"title":{"enabled":true},"labels":{"formatter":" function() { return Math.abs(this.value) + \u0027%\u0027; }"}},"legend":{"enabled":false},"exporting":{"enabled":false},"plotOptions":{"scatter":{"marker":{"radius":6}}},"series":[{"name":"\u0027Product\u0027","data":[{"y":69,"name":"\u0027() Alta All Cap Quality Growth\u0027"},{"y":17,"name":"\u0027() Gratry International Growth\u0027"},{"y":6,"name":"\u0027(IDV) iShares International Select Div ETF\u0027"},{"y":6,"name":"\u0027(BSV) Vanguard Short-Term Bond ETF\u0027"},{"y":2,"name":"\u0027() Adhesion Cash Model\u0027"}]}],"title":{"text":"Top 20 Allocations"}}"

输出:

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)

答案 3 :(得分:1)

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

for phrase in keyword:

现在您需要将短语拆分为实际单词并确定这些单词是否在白名单中。然后你需要把这些话放回去。您可以在一行中完成此操作。

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

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

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

...

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

答案 4 :(得分:0)

您可以使用正则表达式:

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)