取两个由字符串组成的列表:
strings = ['hello everyone!', 'how are you doing?', 'are you doing well?', 'are you okay?', 'good, me too.']searching_for = ['are', 'you', 'doing']
我的目标是搜索其中strings
的每个项目,searching_for
并打印包含这些关键字的完整字符串。即,我希望我的输出是:
Output: ['how are you doing?', 'are you doing well?']
请注意,输出仅是中的第二项和第三项strings
,它不包含第四项。
我不确定为什么这对我来说如此困难,但是我认为这归结为我对Python不够了解。我想让它具有足够的通用性,以便我可以在很大的字符串列表中搜索我提供的关键字。到目前为止,这是我的解决方案:
def search(*args): arg_list = [] search_for = numpy.append(arg_list, args) for i in strings: for j in search_for: if all(j in i) is True: print(i)
但这会引发一个错误TypeError: 'bool' object is not iterable
。我已经使用Python的内置filter
函数和其他一些函数尝试了上述代码的一些不同迭代,但是我一直迷恋于类似的错误。我也不确定是否会给我一个列表,我认为它将在终端的新行中显示结果。
all
(或any
)将尝试遍历其输入;和True
或False
(作为的结果j in i
)不可迭代。这就是导致以下原因的原因TypeError
:
all(True)# TypeError: 'bool' object is not iterable
相反,使您的内部循环更简单:
def search(*args): arg_list = [] arg_list.append(args) for i in strings: if all(j in i for j in arg_list): print(i)
请注意,您没有需要all(...) is True
,因为all
将已要么退回True
或False
另外,在此处使用numpy.append
将元素附加到list
会过分杀人。list.append
直接使用并对其进行迭代。
可以试试
print([i for i in strings if all([s in i for s in searching_for])])
输出量
['how are you doing?', 'are you doing well?']
此列表理解将检查searching_for
list中的所有单词是否在的每个句子中strings
,如果是,它将打印该句子。
试试这个:
for st in strings: if set(searching_for).issubset(set(st[:-1].split())): print(st)
喏,给你 :
strings = ['hello everyone!', 'how are you doing?', 'are you doing well?', 'are you okay?', 'good, me too.']kws = ['are', 'you', 'doing']for s in strings: for w ins.split(): if w in kws: print(s) break
在python中,有一个叫做list comprehension的东西,它比长for
循环结构更有效,更容易阅读。要创建您要查找的列表,这是一个列表理解的示例:
result = [s for s in strings if all(sf in s for sf in searching_for)]# ['how are you doing?', 'are you doing well?']
我认为,它确实是如何告知的:
创建(包围括号)列表
s
变量中的字符串strings
如果可以在以下位置找到所有sf
变量字符串searching_for
s