web-dev-qa-db-ja.com

Pythonで2つのリストに同じ要素が含まれていることをアサートするにはどうすればよいですか?

テストケースを作成するとき、2つのリストには順序に関係なく同じ要素が含まれていると断言する必要があります。

リストをセットに変換することでこれを行ってきました。

これを行う簡単な方法はありますか?

編集

@MarkDickinsonが指摘したように、私は TestCase.assertItemsEqual を使用できます。

TestCase.assertItemsEqualはPython2.7の新機能です。古いバージョンのPythonを使用している場合、 nittest2 -Python 2.7の新機能のバックポートを使用できます。

125
satoru

実装のわずかに高速なバージョン(ほとんどのカップルリストの長さが異なることがわかっている場合):

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
44
defuz

Python 3.2以降、unittest.TestCase.assertItemsEqualdoc )はunittest.TestCase.assertCountEqualdoc )に置き換えられました。 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()

サイドノート:比較するリストの要素がソート可能であることを確認してください。

100
flazzarini

与えられた

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

In Python> = 3.0

assertCountEqual(l1, l2) # True

Python> = 2.7 では、上記の関数の名前は次のとおりです。

assertItemsEqual(l1, l2) # True

In Python<2.7

import unittest2
assertItemsEqual(l1, l2) # True
22
Cory Klein

リストをセットに変換すると、リストに同じ要素が含まれていることがわかります。ただし、この方法では、すべての要素が同数含まれていることを確認できません。たとえば、この場合、メソッドは失敗します。

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つの新しいリストを作成します

19
inspectorG4dget

ensureライブラリが必要ですが、次の方法でリストを比較できます:

ensure([1、2])。contains_only([2、1])

これはアサート例外を発生させません。 thinのドキュメントは本当に薄いので、 githubのコードを確認してください

1
radeklos