我是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']
如果你能提出一些建议我真诚地感激。
答案 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 whitelist
是list 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)