Пример #1
0
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
    
Пример #2
0
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
    
Пример #3
0
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)
Пример #4
0
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)
Пример #5
0
    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
Пример #6
0
    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