remove duplicates

🏠
 1import functools
 2import itertools
 3from typing import List
 4
 5from test_framework import generic_test
 6from test_framework.test_utils import enable_executor_hook
 7
 8
 9class Name:
10    def __init__(self, first_name, last_name):
11        self.first_name, self.last_name = first_name, last_name
12
13    def __eq__(self, other):
14        return self.first_name == other.first_name
15
16    def __lt__(self, other):
17        return (self.first_name < other.first_name
18                if self.first_name != other.first_name else
19                self.last_name < other.last_name)
20
21    def __repr__(self):
22        return '%s %s' % (self.first_name, self.last_name)
23
24
25def eliminate_duplicate(A):
26
27    A.sort()  # Makes identical elements become neighbors.
28    write_idx = 1
29    for i in range(1, len(A)):
30        if A[write_idx - 1] != A[i]:
31            A[write_idx] = A[i]
32            write_idx += 1
33    del A[write_idx:]
34
35
36def eliminate_duplicate_pythonic(A):
37    A.sort()
38    write_idx = 0
39    for cand, _ in itertools.groupby(A):
40        A[write_idx] = cand
41        write_idx += 1
42    del A[write_idx:]
43
44
45@enable_executor_hook
46def eliminate_duplicate_wrapper(executor, names):
47    names = [Name(*x) for x in names]
48
49    executor.run(functools.partial(eliminate_duplicate, names))
50
51    return names
52
53
54def comp(expected, result):
55    return all([
56        e == r.first_name for (e, r) in zip(sorted(expected), sorted(result))
57    ])
58
59
60if __name__ == '__main__':
61    exit(
62        generic_test.generic_test_main('remove_duplicates.py',
63                                       'remove_duplicates.tsv',
64                                       eliminate_duplicate_wrapper, comp))