Last active
August 16, 2017 17:51
-
-
Save lbragstad/a81776e2c679f728c19cad7f3a35703f to your computer and use it in GitHub Desktop.
removing duplicate dictionaries from a list
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import time | |
import unittest | |
class DedupTests(unittest.TestCase): | |
def setUp(self): | |
self.roles = [ | |
{'extra': '', 'id': 1, 'name': 'role1'}, | |
{'id': 2, 'name': 'role2', 'extra': ''}, | |
{'id': 1, 'name': 'role1', 'extra': ''}, # this is a duplicate | |
{'extra': '', 'id': 2, 'name': 'role2'} # this is a duplicate | |
] | |
self.expected = [ | |
{'extra': '', 'id': 1, 'name': 'role1'}, | |
{'id': 2, 'name': 'role2', 'extra': ''} | |
] | |
self.test_start_time = time.time() | |
def assertEqualListOfDicts(self, a, b): | |
self.assertEqual(len(a), len(b)) | |
for item in a: | |
self.assertIn(item, b) | |
def test_dedup_by_containment(self): | |
unique_roles = [] | |
for role in self.roles: | |
if role not in unique_roles: | |
unique_roles.append(role) | |
elapsed = time.time() - self.test_start_time | |
print('{} ({}s)'.format(self.id(), elapsed)) | |
self.assertEqualListOfDicts(unique_roles, self.expected) | |
def test_dedup_by_list_comprehension(self): | |
unique_roles = [ | |
dict(t) for t in set([tuple(d.items()) for d in self.roles]) | |
] | |
elapsed = time.time() - self.test_start_time | |
print('{} ({}s)'.format(self.id(), elapsed)) | |
self.assertEqualListOfDicts(unique_roles, self.expected) | |
def test_dedup_by_dict_values(self): | |
unique = {} | |
for role in self.roles: | |
unique[role['id']] = role | |
unique_roles = list(unique.values()) | |
elapsed = time.time() - self.test_start_time | |
print('{} ({}s)'.format(self.id(), elapsed)) | |
self.assertEqualListOfDicts(unique_roles, self.expected) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment