如何断言Python中包含相同元素的两个列表?

2024-03-28 19:51:00 发布

您现在位置:Python中文网/ 问答频道 /正文

在编写测试用例时,我经常需要断言两个列表包含相同的元素,而不考虑它们的顺序。

我一直在把列表转换成集合。

有什么更简单的方法吗?

编辑

正如@MarkDickinson所指出的,我可以使用TestCase.assertItemsEqual

注意TestCase.assertItemsEqual在Python2.7中是新的。 如果您使用的是较旧版本的Python,那么可以使用unittest2-Python 2.7新特性的后台端口。


Tags: 方法端口元素编辑列表顺序测试用例特性
3条回答

稍微快一点的实现版本(如果您知道大多数情侣列表的长度不同):

def checkEqual(L1, L2):
    return len(L1) == len(L2) and sorted(L1) == sorted(L2)

比较:

>>> timeit(lambda: sorting([1,2,3], [3,2,1]))
2.42745304107666
>>> timeit(lambda: lensorting([1,2,3], [3,2,1]))
2.5644469261169434 # speed down not much (for large lists the difference tends to 0)

>>> timeit(lambda: sorting([1,2,3], [3,2,1,0]))
2.4570400714874268
>>> timeit(lambda: lensorting([1,2,3], [3,2,1,0]))
0.9596951007843018 # speed up

从Python 3.2开始,unittest.TestCase.assertItemsEqualdoc)已经被unittest.TestCase.assertCountEqualdoc)所取代,它正是您所寻找的,正如您可以从Pythonstandard library documentation中读取的那样。这个方法的名字有点误导人,但它确实符合你的要求。

a and b have the same elements in the same number, regardless of their order

这里有一个简单的例子,比较两个具有相同元素但顺序不同的列表。

  • 使用assertCountEqual测试将成功
  • 使用assertListEqual由于两个列表的顺序不同,测试将失败

这里有一个小的脚本示例。

import unittest


class TestListElements(unittest.TestCase):
    def setUp(self):
        self.expected = ['foo', 'bar', 'baz']
        self.result = ['baz', 'foo', 'bar']

    def test_count_eq(self):
        """Will succeed"""
        self.assertCountEqual(self.result, self.expected)

    def test_list_eq(self):
        """Will fail"""
        self.assertListEqual(self.result, self.expected)

if __name__ == "__main__":
    unittest.main()

边注:请确保要比较的列表中的元素是可排序的。

给定

l1 = [a,b]
l2 = [b,a]

In Python >= 3.0

assertCountEqual(l1, l2) # True

In Python >= 2.7,上面的函数名为:

assertItemsEqual(l1, l2) # True

In Python < 2.7

import unittest2
assertItemsEqual(l1, l2) # True

Via ^{} module(任何Python版本)

import unittest
import six
class MyTest(unittest.TestCase):
    def test(self):
        six.assertCountEqual(self, self.l1, self.l2) # True

相关问题 更多 >