From f7414041f6ae1e39651acd0d0f3169b3a9e475ee Mon Sep 17 00:00:00 2001 From: Michael Hanselmann <hansmi@google.com> Date: Tue, 20 Nov 2007 09:17:58 +0000 Subject: [PATCH] Add function to return list with unique elements. Reviewed-by: ultrotter --- lib/utils.py | 9 +++++++++ test/ganeti.utils_unittest.py | 23 +++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/lib/utils.py b/lib/utils.py index 73d1bbb8e..f9f5f1b39 100644 --- a/lib/utils.py +++ b/lib/utils.py @@ -1002,3 +1002,12 @@ def any(seq, pred=bool): for elem in itertools.ifilter(pred, seq): return True return False + + +def UniqueSequence(seq): + """Returns a list with unique elements. + + Element order is preserved. + """ + seen = set() + return [i for i in seq if i not in seen and not seen.add(i)] diff --git a/test/ganeti.utils_unittest.py b/test/ganeti.utils_unittest.py index 88920671a..8ec8be070 100755 --- a/test/ganeti.utils_unittest.py +++ b/test/ganeti.utils_unittest.py @@ -608,5 +608,28 @@ class TestNewUUID(unittest.TestCase): self.failUnless(self._re_uuid.match(utils.NewUUID())) +class TestUniqueSequence(unittest.TestCase): + """Test case for UniqueSequence""" + + def _test(self, input, expected): + self.assertEqual(utils.UniqueSequence(input), expected) + + def runTest(self): + # Ordered input + self._test([1, 2, 3], [1, 2, 3]) + self._test([1, 1, 2, 2, 3, 3], [1, 2, 3]) + self._test([1, 2, 2, 3], [1, 2, 3]) + self._test([1, 2, 3, 3], [1, 2, 3]) + + # Unordered input + self._test([1, 2, 3, 1, 2, 3], [1, 2, 3]) + self._test([1, 1, 2, 3, 3, 1, 2], [1, 2, 3]) + + # Strings + self._test(["a", "a"], ["a"]) + self._test(["a", "b"], ["a", "b"]) + self._test(["a", "b", "a"], ["a", "b"]) + + if __name__ == '__main__': unittest.main() -- GitLab