Feel free to use and share it:
This file contains 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
from collections import OrderedDict | |
class OrderedSet(OrderedDict): | |
def pop(self): | |
""" Returns and removes last element of the set """ | |
if not self: | |
raise KeyError('dictionary is empty') | |
key = next(reversed(self)) | |
del self[key] | |
return key | |
def peek(self): | |
""" Returns last element of the set without removing it """ | |
if not self: | |
raise KeyError('dictionary is empty') | |
key = next(reversed(self)) | |
return key | |
def at(self, i): | |
""" Returns element at the index """ | |
if not self: | |
raise KeyError('dictionary is empty') | |
return list(self)[i] | |
def extend(self, iterable): | |
""" Extends OrderedList by appending elements from the iterable """ | |
for element in iterable: | |
if element not in self: | |
self[element] = True | |
def append(self, element): | |
""" Appends an element to the end of the ordered set """ | |
if element not in self: | |
self[element] = True |
This file contains 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
def test_ordered_set_a(): | |
o_s = OrderedSet() | |
SIZE = 100 | |
for i in range(SIZE): | |
o_s.append(i) | |
for i in range(SIZE * 2): | |
assert o_s.peek() == SIZE - 1 | |
for i in range(SIZE): | |
assert o_s.pop() == SIZE - 1 - i | |
assert len(o_s) == 0 | |
just_a_list = [i for i in range(SIZE)] | |
o_s.extend(just_a_list) | |
for i in range(SIZE): | |
assert o_s.at(i) == i | |
o_s.extend(just_a_list) | |
assert len(o_s) == SIZE | |
for i in range(SIZE): | |
assert o_s.at(i) == i | |
just_a_list = [i for i in range(SIZE / 2, SIZE * 2)] | |
o_s.extend(just_a_list) | |
assert len(o_s) == SIZE * 2 | |
for i in range(SIZE * 2): | |
assert o_s.at(i) == i |
Cheers!
[1] Algorithms: Design and Analysis, Part 1
https://class.coursera.org/algo-004/class/index