Python Unittest-断言列表中的一组项是否包含在另一个列表中

Python Unittest-断言列表中的一组项是否包含在另一个列表中,python,python-2.7,list,unit-testing,assert,Python,Python 2.7,List,Unit Testing,Assert,您好,我是编程新手,正在尝试做一个测试,检查项目列表中的任何项目是否存在于另一个列表中(使用Python 2.7中的unittest) 例如,如果我有一个列表[“狗”、“猫”、“青蛙],并且我正在测试的方法的结果是[“老虎”、“狮子”、“袋鼠”、“青蛙],我希望测试失败,因为它包含前面列表中的一个项目(“青蛙”)。我还想让测试告诉我两个列表都有哪些单词(即哪些单词导致测试失败) 我试过: self.assertIn(["cat", "dog"], method("cat dog tiger"))

您好,我是编程新手,正在尝试做一个测试,检查项目列表中的任何项目是否存在于另一个列表中(使用Python 2.7中的unittest)

例如,如果我有一个列表[“狗”、“猫”、“青蛙],并且我正在测试的方法的结果是[“老虎”、“狮子”、“袋鼠”、“青蛙],我希望测试失败,因为它包含前面列表中的一个项目(“青蛙”)。我还想让测试告诉我两个列表都有哪些单词(即哪些单词导致测试失败)

我试过:

self.assertIn(["cat", "dog"], method("cat dog tiger"))
该方法的结果为[“猫”、“狗”、“老虎”],但测试结果为失败,并表示:

AssertionError: ['cat', 'dog'] not found in ['cat', 'dog', 'tiger']
我希望此测试返回ok,因为“猫”和“狗”出现在第二个列表中。似乎assertIn没有做我认为它会做的事情(我以为它是为了检查b中是否有a)

反之亦然,当我希望assertNotIn失败时,它就会通过

我已经找了一段时间了,但因为我不确定我在找什么,所以很难找到

谢谢你的阅读,我希望这是有意义的

编辑:我使用了Chris的解决方案,它可以按照我的要求工作:

def myComp(list1, list2):
    section = list(set(list1).intersection(list2))
为了获得错误消息中重叠的单词列表(即触发失败),我从这里添加了以下代码:

结果正是我想要的:

AssertionError: ('The following are pressent in the processed text', ['dog', 
'cat'])
你应该看一看,然后你可以很容易地看到像这样的东西:

def myComp(list1, list2):
  section = list(set(list1).intersection(list2))
  return ((len(section)==0), section)
此函数将返回一个元组,其中布尔值表示失败或成功,以及两个列表中出现的项目列表


如果您真的想在assert语句中执行此操作,您可以只使用该元组的第一个元素…

您可以迭代列表和
ASSERTN
,或者使用
set
s,您可以执行类似于
self.assertTrue(set(a).issuperset(set(b))的操作

>

如果你期望你的序列中有不可重复的值,也许最好考虑使用集合,因为你可以很容易地检查它们是否有任何重叠。

>>> a, b = {'dog', 'cat'}, {'dog', 'cat', 'wolf', 'crab'}
>>> a & b
set(['dog', 'cat'])
>>> a ^ b
set(['wolf', 'crab'])
因此,检查a是否为b的子集类似于:

>>> not bool(a ^ b & a)
True

etc

列表
['cat','dog']
在列表中找不到该列表
['cat','dog','tiger']
尝试
在['a']
的提示符中打印['a']-这是错误的,因为列表不在列表中,并且它没有进行元素级的比较。谢谢Chris,这完全符合我的要求。我确实希望保留assert语句,但也希望列出导致失败的原因。搜索堆栈溢出我发现了一篇关于更改我添加到代码末尾的断言错误语句的帖子,我希望这是一个好的编程实践,因为它正是我所需要的try:assert(len(section)==0),但AssertionError为e:e.args+=(“以下内容在已处理文本中显示”,section)引发
>>> a, b = {'dog', 'cat'}, {'dog', 'cat', 'wolf', 'crab'}
>>> a & b
set(['dog', 'cat'])
>>> a ^ b
set(['wolf', 'crab'])
>>> not bool(a ^ b & a)
True