我想测试reference_list
是否包含required_strings
中的所有项目。
required_strings = ['apple','banana','carrot']
reference_list = [['apple','tree'],
['banana','grass'],
['carrot','grass']]
我希望得到真或假作为测试结果。预期的答案是“真实的”。
这就是我的尝试:
test = [i for i in reference_list if any(s in i for s in required_strings)]
print test
答案 0 :(得分:4)
您可以使用set
和itertools.chain
来完成此操作。我们将利用某些集理论并将required_strings
和reference_list
视为集合,并证明required_strings <= reference_list
;也就是说,所需的字符串集完全包含在引用列表中。
首先,使用itertools.chain
展平浅层列表。
from itertools import chain
chain(*reference_list) # Iterable object
接下来,将链式列表和测试列表都转换为集合并进行比较,以查看另一个中的if one set is completely contained。
from itertools import chain
set(required_strings) <= set(chain(*reference_list))
如果您使用chain
热衷于 ,那么您可以使用sum(list_of_lists, [])
来减少它。
set(required_strings) <= set(sum(reference_lists, []))
但是,我强烈建议您使用set
代替list
,因为此类问题更适合set
。你也不必进口它;您可以像使用list
一样使用该课程。
答案 1 :(得分:1)
没有理由尝试任何超级花哨或简洁的东西,直到你有一个你理解的工作解决方案。
首先尝试使您的答案尽可能与问题的英语说明相似。基本上你应该遍历所需列表中的字符串并检查它们是否在任何子列表中。这是一个可以成为函数的存根。
for req_string in required_strings:
appears_in_reference = False
for sub_list in reference_list:
if req_string in sub_list:
appears_in_reference = True
break
if not appears_in_reference:
return False
return True
答案 2 :(得分:0)
Python 2 这是一种方法:
import itertools
required_strings = ['apple','banana','carrot']
reference_list = [['apple','tree'],
['banana','grass'],
['carrot','grass']]
x = list(itertools.chain(*reference_list))
print all(l in x for l in required_strings )
输出:
True
答案 3 :(得分:0)
这是一个返回bool列表的理解:
>>> test = [(True if i in s else False) for i in required_strings for s in reference_list]
[True, False, False, False, True, False, False, False, True]
或者,使用生成器理解来检查原始所需字符串列表的长度。注意使用()而不是[]。
>>> test = ((True if i in s else False) for i in required_strings for s in reference_list)
然后,根据长度检查:
>>> counter = 0
>>> for truthiness in test:
... if truthiness == True:
... counter += 1
>>> len(required_strings) == counter
True
编辑:这可能只适用于Python 3.4+,但我认为值得推出。