テストケースを作成するとき、2つのリストには順序に関係なく同じ要素が含まれていると断言する必要があります。
リストをセットに変換することでこれを行ってきました。
これを行う簡単な方法はありますか?
編集:
@MarkDickinsonが指摘したように、私は TestCase.assertItemsEqual を使用できます。
TestCase.assertItemsEqual
はPython2.7の新機能です。古いバージョンのPythonを使用している場合、 nittest2 -Python 2.7の新機能のバックポートを使用できます。
実装のわずかに高速なバージョン(ほとんどのカップルリストの長さが異なることがわかっている場合):
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 )に置き換えられました。 python 標準ライブラリドキュメント 。このメソッドはやや誤解を招くような名前が付けられていますが、探しているものとまったく同じです。
aとbは、順序に関係なく、同じ番号の同じ要素を持ちます
ここでは、要素が同じで順序が異なる2つのリストを比較する簡単な例を示します。
assertCountEqual
を使用すると、テストは成功しますassertListEqual
を使用すると、2つのリストの順序の違いによりテストが失敗しますここに小さなスクリプトの例を示します。
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 __== "__main__":
unittest.main()
サイドノート:比較するリストの要素がソート可能であることを確認してください。
与えられた
l1 = [a,b]
l2 = [b,a]
assertCountEqual(l1, l2) # True
Python> = 2.7 では、上記の関数の名前は次のとおりです。
assertItemsEqual(l1, l2) # True
import unittest2
assertItemsEqual(l1, l2) # True
リストをセットに変換すると、リストに同じ要素が含まれていることがわかります。ただし、この方法では、すべての要素が同数含まれていることを確認できません。たとえば、この場合、メソッドは失敗します。
L1 = [1,2,2,3]
L2 = [1,2,3,3]
2つのリストを並べ替えて比較する方が良いでしょう。
def checkEqual(L1, L2):
if sorted(L1) == sorted(L2):
print "the two lists are the same"
return True
else:
print "the two lists are not the same"
return False
これは、2つのリストの構造/内容を変更しないことに注意してください。むしろ、ソートは2つの新しいリストを作成します
ensureライブラリが必要ですが、次の方法でリストを比較できます:
ensure([1、2])。contains_only([2、1])
これはアサート例外を発生させません。 thinのドキュメントは本当に薄いので、 githubのコードを確認してください