列表推导式报错:TypeError: 'in <string>'需左操作数为字符串而非列表
解决TypeError: 'in ' requires string as left operand, not list的问题
嘿,这个错误的根源是你的代码里有两处逻辑问题,我来一步步帮你修正:
错误原因解析
你写的列表推导式里:
[1 if re.search(top_words_list) in i else 0 for i in amazon['reviewer_summary']]
re.search(top_words_list)不符合要求:re.search()的第一个参数必须是正则表达式字符串,不能直接传列表top_words_list。- 就算你修正了
re.search的参数,re.search(...) in i的逻辑也不对——in运算符左边需要是字符串,而re.search()返回的是匹配对象(或None),这就触发了你看到的类型错误。
几种可行的解决方案
方案1:不用正则,直接检查单词是否存在(简单快速)
用any()函数遍历top_words_list,只要列表里有任意一个单词出现在当前的reviewer_summary字符串中,就标记为1:
top_words_list = ['great', 'love', 'good', 'story', 'loved', 'excellent', 'series', 'best', 'one'] amazon['has_top_word'] = [1 if any(word in summary for word in top_words_list) else 0 for summary in amazon['reviewer_summary']]
方案2:用正则匹配完整单词(避免部分匹配)
如果你想避免“good”匹配到“goodbye”这类情况,可以用正则的单词边界\b,把列表转成可选的正则模式:
import re top_words_list = ['great', 'love', 'good', 'story', 'loved', 'excellent', 'series', 'best', 'one'] # 构建正则模式:匹配列表中任意一个完整单词 pattern = r'\b(' + '|'.join(top_words_list) + r')\b' amazon['has_top_word'] = [1 if re.search(pattern, summary) else 0 for summary in amazon['reviewer_summary']]
方案3:用Pandas向量化操作(最高效)
如果你的数据量比较大,推荐用Pandas内置的str.contains()方法,这是向量化操作,比列表推导式快很多:
import re top_words_list = ['great', 'love', 'good', 'story', 'loved', 'excellent', 'series', 'best', 'one'] pattern = r'\b(' + '|'.join(top_words_list) + r')\b' amazon['has_top_word'] = amazon['reviewer_summary'].str.contains(pattern, regex=True).astype(int)
这里str.contains()会返回布尔值(True/False),用astype(int)可以把它转成1/0。
内容的提问来源于stack exchange,提问作者Jake Park
相关产品推荐
相关产品推荐

