Skip to content

Commit 761732b

Browse files
add slicing to linked list structure
1 parent 052ec24 commit 761732b

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

packetraven/structures.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
from typing import Any, Iterable, List, Union
2+
3+
14
class DoublyLinkedList:
25
"""
36
A linked list is a series of node objects, each with a link (object reference) to the next node in the series.
@@ -147,7 +150,7 @@ def count(self, value) -> int:
147150
return sum([1 for node_value in self if node_value == value])
148151

149152
@property
150-
def difference(self) -> []:
153+
def difference(self) -> [Any]:
151154
"""
152155
differences between each value
153156
@@ -212,8 +215,15 @@ def _remove_node(self, node: Node):
212215
else:
213216
self.head = node.next_node
214217

215-
def __getitem__(self, index: int):
216-
return self._node_at_index(index).value
218+
def __getitem__(self, index: Union[int, Iterable[int], slice]) -> Union[Any, List[Any]]:
219+
if isinstance(index, int):
220+
return self._node_at_index(index).value
221+
elif isinstance(index, Iterable):
222+
return [self.__getitem__(value) for value in index]
223+
elif isinstance(index, slice):
224+
return self.__getitem__(range(*(value for value in (index.start, index.stop, index.step) if value is not None)))
225+
else:
226+
raise ValueError(f'unrecognized index: {index}')
217227

218228
def __setitem__(self, index: int, value):
219229
self._node_at_index(index).value = value

tests/test_structures.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ def test_index():
1010
assert list_1[-2] == 5
1111
assert list_1[-1] == 6
1212
assert list_1[-1] is list_1.tail.value
13+
assert list_1[:2] == [0, 5]
14+
assert list_1[[1, 3, 0]] == [5, 'foo', 0]
1315

1416

1517
def test_length():

0 commit comments

Comments
 (0)