2024-03-28 19:51:00 发布
网友
在编写测试用例时,我经常需要断言两个列表包含相同的元素,而不考虑它们的顺序。
我一直在把列表转换成集合。
有什么更简单的方法吗?
编辑:
正如@MarkDickinson所指出的,我可以使用TestCase.assertItemsEqual。
注意TestCase.assertItemsEqual在Python2.7中是新的。 如果您使用的是较旧版本的Python,那么可以使用unittest2-Python 2.7新特性的后台端口。
TestCase.assertItemsEqual
稍微快一点的实现版本(如果您知道大多数情侣列表的长度不同):
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.assertItemsEqual(doc)已经被unittest.TestCase.assertCountEqual(doc)所取代,它正是您所寻找的,正如您可以从Pythonstandard library documentation中读取的那样。这个方法的名字有点误导人,但它确实符合你的要求。
unittest.TestCase.assertItemsEqual
unittest.TestCase.assertCountEqual
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
稍微快一点的实现版本(如果您知道大多数情侣列表的长度不同):
比较:
从Python 3.2开始,
unittest.TestCase.assertItemsEqual
(doc)已经被unittest.TestCase.assertCountEqual
(doc)所取代,它正是您所寻找的,正如您可以从Pythonstandard library documentation中读取的那样。这个方法的名字有点误导人,但它确实符合你的要求。这里有一个简单的例子,比较两个具有相同元素但顺序不同的列表。
assertCountEqual
测试将成功assertListEqual
由于两个列表的顺序不同,测试将失败这里有一个小的脚本示例。
边注:请确保要比较的列表中的元素是可排序的。
给定
In Python >= 3.0
In Python >= 2.7,上面的函数名为:
In Python < 2.7
Via ^{} module (任何Python版本)
相关问题 更多 >
编程相关推荐