206

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

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

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

編集

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

TestCase.assertItemsEqualPython2.7で新しく追加されたメモ。古いバージョンのPythonを使用している場合は、Python2.7の新機能のバックポートであるunittest2を使用できます。

4

5 に答える 5

208

Python 3.2以降unittest.TestCase.assertItemsEqual、(doc)は(docunittest.TestCase.assertCountEqual置き換えられました。これは、Python標準ライブラリのドキュメントから読み取ることができるように、探しているものを正確に実行します。このメソッドはやや誤解を招くような名前が付けられていますが、まさにあなたが探しているものを実行します。

aとbは、順序に関係なく、同じ番号の同じ要素を持っています

これは、同じ要素を持つが順序が異なる2つのリストを比較する簡単な例です。

  • テストの使用assertCountEqualは成功します
  • 2つのリストの順序が異なるため、テストの使用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()

補足:比較しているリストの要素が並べ替え可能であることを確認してください。

于 2015-08-05T12:24:32.767 に答える
57

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

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
于 2012-10-10T07:13:08.830 に答える
32

与えられた

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

Pythonの場合>=3.0

assertCountEqual(l1, l2) # True

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

assertItemsEqual(l1, l2) # True

Pythonでは<2.7

import unittest2
assertItemsEqual(l1, l2) # True

sixモジュール経由(任意のPythonバージョン)

import unittest
import six
class MyTest(unittest.TestCase):
    def test(self):
        six.assertCountEqual(self, self.l1, self.l2) # True
于 2016-01-29T23:20:53.130 に答える
20

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

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

于 2012-10-10T06:59:43.603 に答える
1

ライブラリを確保する必要がありますが、次の方法でリストを比較できます。

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

これにより、アサート例外は発生しません。thinのドキュメントは本当に薄いので、githubでensureのコードを確認することをお勧めします

于 2015-03-25T15:12:27.207 に答える