def test(): '''Test the basic workings of `get_length`.''' assert get_length(range(3)) == 3 assert get_length(xrange(4)) == 4 assert get_length(set(xrange(5))) == 5 assert get_length(iter(set(xrange(16, 10, -1)))) == 6
def test(): '''Test the basic workings of `get_length`.''' assert get_length(list(range(3))) == 3 assert get_length(range(4)) == 4 assert get_length(set(range(5))) == 5 assert get_length(iter(set(range(16, 10, -1)))) == 6
def get_n_identical_edge_characters(string, character=None, head=True): ''' Get the number of identical characters at `string`'s head. For example, the result for 'qqqwe' would be `3`, while the result for 'meow' will be `1`. Specify `character` to only consider that character; if a different character is found at the head, `0` will be returned. Specify `head=False` to search the tail instead of the head. ''' from python_toolbox import cute_iter_tools if not string: return 0 found_character, character_iterator = next( itertools.groupby(string if head else reversed(string))) if (character is not None) and found_character != character: assert isinstance(character, str) and len(character) == 1 return 0 return cute_iter_tools.get_length(character_iterator)
def get_n_identical_edge_characters(string, character=None, head=True): ''' Get the number of identical characters at `string`'s head. For example, the result for 'qqqwe' would be `3`, while the result for 'meow' will be `1`. Specify `character` to only consider that character; if a different character is found at the head, `0` will be returned. Specify `head=False` to search the tail instead of the head. ''' from python_toolbox import cute_iter_tools if not string: return 0 found_character, character_iterator = next( itertools.groupby(string if head else reversed(string)) ) if (character is not None) and found_character != character: assert isinstance(character, str) and len(character) == 1 return 0 return cute_iter_tools.get_length(character_iterator)
def __init__(self, slice_, iterable_or_length=None, offset=0): from python_toolbox import sequence_tools from python_toolbox import cute_iter_tools if isinstance(slice_, CanonicalSlice): slice_ = slice(slice_.start, slice_.stop, slice_.step) assert isinstance(slice_, slice) self.given_slice = slice_ if iterable_or_length is not None: if isinstance(iterable_or_length, math_tools.PossiblyInfiniteIntegral): self.length = iterable_or_length elif isinstance(iterable_or_length, collections.Sequence): self.length = sequence_tools.get_length(iterable_or_length) else: assert isinstance(iterable_or_length, collections.Iterable) self.length = cute_iter_tools.get_length(iterable_or_length) else: self.length = None self.offset = offset ### Parsing `step`: ################################################### # # assert slice_.step != 0 if slice_.step is None: self.step = 1 else: self.step = slice_.step # # ### Finished parsing `step`. ########################################## ### Parsing `start`: ################################################# # # if slice_.start is None: if self.step > 0: self.start = 0 + self.offset else: assert self.step < 0 self.start = (self.length + self.offset) if \ (self.length is not None) else infinity else: # s.start is not None if self.length is not None: if slice_.start < 0: self.start = \ max(slice_.start + self.length, 0) + self.offset else: self.start = min(slice_.start, self.length) + self.offset else: self.start = slice_.start + self.offset # # ### Finished parsing `start`. ######################################### ### Parsing `stop`: ################################################### # # if slice_.stop is None: if self.step > 0: self.stop = (self.length + self.offset) if \ (self.length is not None) else infinity else: assert self.step < 0 self.stop = -infinity else: # slice_.stop is not None if self.length is not None: if slice_.stop < 0: self.stop = max(slice_.stop + self.length, 0) + self.offset else: # slice_.stop >= 0 self.stop = min(slice_.stop, self.length) + self.offset else: self.stop = slice_.stop + self.offset # # ### Finished parsing `stop`. ########################################## if (self.step > 0 and self.start >= self.stop >= 0) or \ (self.step < 0 and self.stop >= self.start): # We have a case of an empty slice. self.start = self.stop = 0 self.slice_ = slice( *((item if item not in math_tools.infinities else None) for item in self)) ### Doing sanity checks: ############################################## # # if self.length: if self.step > 0: assert 0 <= self.start <= \ self.stop <= self.length + self.offset else: assert self.step < 0 assert 0 <= self.stop <= \ self.start <= self.length + self.offset
def __init__(self, slice_, iterable_or_length=None, offset=0): from python_toolbox import sequence_tools from python_toolbox import cute_iter_tools if isinstance(slice_, CanonicalSlice): slice_ = slice(slice_.start, slice_.stop, slice_.step) assert isinstance(slice_, slice) self.given_slice = slice_ if iterable_or_length is not None: if isinstance(iterable_or_length, math_tools.PossiblyInfiniteIntegral): self.length = iterable_or_length elif isinstance(iterable_or_length, collections.Sequence): self.length = sequence_tools.get_length(iterable_or_length) else: assert isinstance(iterable_or_length, collections.Iterable) self.length = cute_iter_tools.get_length(iterable_or_length) else: self.length = None self.offset = offset ### Parsing `step`: ################################################### # # assert slice_.step != 0 if slice_.step is None: self.step = 1 else: self.step = slice_.step # # ### Finished parsing `step`. ########################################## ### Parsing `start`: ################################################# # # if slice_.start is None: if self.step > 0: self.start = 0 + self.offset else: assert self.step < 0 self.start = (self.length + self.offset) if \ (self.length is not None) else infinity else: # s.start is not None if self.length is not None: if slice_.start < 0: self.start = \ max(slice_.start + self.length, 0) + self.offset else: self.start = min(slice_.start, self.length) + self.offset else: self.start = slice_.start + self.offset # # ### Finished parsing `start`. ######################################### ### Parsing `stop`: ################################################### # # if slice_.stop is None: if self.step > 0: self.stop = (self.length + self.offset) if \ (self.length is not None) else infinity else: assert self.step < 0 self.stop = -infinity else: # slice_.stop is not None if self.length is not None: if slice_.stop < 0: self.stop = max(slice_.stop + self.length, 0) + self.offset else: # slice_.stop >= 0 self.stop = min(slice_.stop, self.length) + self.offset else: self.stop = slice_.stop + self.offset # # ### Finished parsing `stop`. ########################################## if (self.step > 0 and self.start >= self.stop >= 0) or \ (self.step < 0 and self.stop >= self.start): # We have a case of an empty slice. self.start = self.stop = 0 self.slice_ = slice(*((item if item not in math_tools.infinities else None) for item in self)) ### Doing sanity checks: ############################################## # # if self.length: if self.step > 0: assert 0 <= self.start <= \ self.stop <= self.length + self.offset else: assert self.step < 0 assert 0 <= self.stop <= \ self.start <= self.length + self.offset