Skip to content

Instantly share code, notes, and snippets.

@lbragstad
Last active August 16, 2017 17:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lbragstad/a81776e2c679f728c19cad7f3a35703f to your computer and use it in GitHub Desktop.
Save lbragstad/a81776e2c679f728c19cad7f3a35703f to your computer and use it in GitHub Desktop.
removing duplicate dictionaries from a list
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