测试所有元素是否都在Python的另一个列表中

时间:2015-06-14 02:20:54

标签: python-2.7

我想测试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

4 个答案:

答案 0 :(得分:4)

您可以使用setitertools.chain来完成此操作。我们将利用某些集理论并将required_stringsreference_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+,但我认为值得推出。