Python's indexing conventions

Liste des GroupesRevenir à cl python 
Sujet : Python's indexing conventions
De : ram (at) *nospam* zedat.fu-berlin.de (Stefan Ram)
Groupes : comp.lang.python
Date : 31. Dec 2024, 22:00:26
Autres entêtes
Organisation : Stefan Ram
Message-ID : <Indexing-20241231214317@ram.dialup.fu-berlin.de>
ram@zedat.fu-berlin.de (Stefan Ram) wrote or quoted:
|Raymond Boute <raymond.boute@pandora.be> wrote or quoted:
|>Moreover, using index -1 for the last item is a bad choice
|This feature is the bee's knees, man.

  I was just looking for a list with a sort of "max-out" vibe
  that turns all negative indices into zeros. My AI wingman
  whipped it up for me.

  In my code, it goes by "SourceList":

s = list( 'Example' )
t = SourceList( 'Example' )

print( repr( s[ -1: 2 ] ))
print( repr( t[ -1: 2 ] ))

 spits out:

[]
['E', 'x']

  'cause "t[ -1: 2 ]" is basically the same as "s[ 0: 2 ]".

  Here's the whole shebang:

from collections.abc import MutableSequence

class SourceList(MutableSequence):
    '''
    Interpret all negative indices in subscriptions and slices to mean 0.
    '''
    def __init__(self, iterable=None):
        self._list = list(iterable) if iterable is not None else []

    def _normalize_index(self, index):
        return max(0, index) if isinstance(index, int) else index

    def _normalize_slice(self, key):
        start = self._normalize_index(key.start) if key.start is not None else None
        stop = self._normalize_index(key.stop) if key.stop is not None else None
        return slice(start, stop, key.step)

    def __getitem__(self, key):
        if isinstance(key, slice):
            key = self._normalize_slice(key)
        else:
            key = self._normalize_index(key)
        return self._list[key]

    def __setitem__(self, key, value):
        if isinstance(key, slice):
            key = self._normalize_slice(key)
        else:
            key = self._normalize_index(key)
        self._list[key] = value

    def __delitem__(self, key):
        if isinstance(key, slice):
            key = self._normalize_slice(key)
        else:
            key = self._normalize_index(key)
        del self._list[key]

    def __len__(self):
        return len(self._list)

    def insert(self, index, value):
        self._list.insert(self._normalize_index(index), value)

    def __str__(self):
        return f"SourceList({self._list})"

    def __repr__(self):
        return self.__str__()

s = list( 'Example' )
t = SourceList( 'Example' )

print( repr( s[  0: 2 ] ))
print( repr( t[ -1: 2 ] ))

  .



Date Sujet#  Auteur
31 Dec 24 o Python's indexing conventions1Stefan Ram

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal