Поиск…


Синтаксис

  • OBJ [начать: остановка: шаг]
  • ломтик (стоп)
  • срез (начало, остановка [, шаг])

параметры

Paramer Описание
obj Объект, из которого вы хотите извлечь «под-объект» из
start Индекс obj , с которого вы хотите, чтобы суб-объект начинался (помните, что Python имеет нуль-индексирование, что означает, что первый элемент obj имеет индекс 0 ). Если опустить, значение по умолчанию равно 0 .
stop Индекс (не включительно) obj который вы хотите, чтобы подпоследовательный объект заканчивался. Если опущено, по умолчанию используется len(obj) .
step Позволяет выбрать только каждый элемент step . Если опущено, значение по умолчанию равно 1 .

замечания

Вы можете унифицировать концепцию секущих строк с разбиением других последовательностей, просмотрев строки как неизменную коллекцию символов, с оговоркой, что символ Юникода представлен строкой длиной 1.

В математической нотации вы можете рассмотреть нарезку, чтобы использовать полуоткрытый интервал [start, end) , то есть начало включено, но конец не является. Полуоткрытая природа интервала имеет то преимущество, что len(x[:n]) = n где len(x) > = n , а интервал, закрытый в начале, имеет то преимущество, что x[n:n+1] = [x[n]] где x - список с len(x) >= n , сохраняя при этом согласованность между индексацией и обозначением нарезки.

Базовая нарезка

Для любого итеративного (например, строки, списка и т. Д.) Python позволяет вам срезать и возвращать подстроку или подсписку своих данных.

Формат для нарезки:

iterable_name[start:stop:step]

где,

  • start - это первый индекс среза. По умолчанию 0 (индекс первого элемента)
  • stop один из последних индексов среза. По умолчанию len (iterable)
  • step - размер шага (лучше объясняется примерами ниже)

Примеры:

a = "abcdef"
a            # "abcdef" 
             # Same as a[:] or a[::] since it uses the defaults for all three indices
a[-1]        # "f"
a[:]         # "abcdef" 
a[::]        # "abcdef" 
a[3:]        # "def" (from index 3, to end(defaults to size of iterable)) 
a[:4]        # "abcd" (from beginning(default 0) to position 4 (excluded)) 
a[2:4]       # "cd" (from position 2, to position 4 (excluded)) 

Кроме того, любой из вышеперечисленных может использоваться с заданным размером шага:

a[::2]       # "ace" (every 2nd element)
a[1:4:2]     # "bd" (from index 1, to index 4 (excluded), every 2nd element)

Индексы могут быть отрицательными, и в этом случае они вычисляются с конца последовательности

a[:-1]     # "abcde" (from index 0 (default), to the second last element (last element - 1))
a[:-2]     # "abcd" (from index 0 (default), to the third last element (last element -2))
a[-1:]     # "f" (from the last element to the end (default len()) 

Размеры шагов также могут быть отрицательными, и в этом случае срез будет перебираться по списку в обратном порядке:

a[3:1:-1]   # "dc" (from index 2 to None (default), in reverse order)

Эта конструкция полезна для изменения итерации

a[::-1]     # "fedcba" (from last element (default len()-1), to first, in reverse order(-1))

Обратите внимание на то, что для отрицательных шагов по умолчанию end_index не None (см http://stackoverflow.com/a/12521981 )

a[5:None:-1] # "fedcba" (this is equivalent to a[::-1])
a[5:0:-1]    # "fedcb" (from the last element (index 5) to second element (index 1)

Создание мелкой копии массива

Быстрый способ сделать копию массива (в отличие от назначения переменной с другой ссылкой на исходный массив):

arr[:]

Рассмотрим синтаксис. [:] означает, что start , end и slice опущены. По умолчанию они равны 0 , len(arr) и 1 соответственно, что означает, что подмассиво, которое мы запрашиваем, будет иметь все элементы arr от начала до самого конца.

На практике это выглядит примерно так:

arr = ['a', 'b', 'c']
copy = arr[:]
arr.append('d')
print(arr)    # ['a', 'b', 'c', 'd']
print(copy)   # ['a', 'b', 'c']

Как вы можете видеть, arr.append('d') добавил d к arr , но copy осталась неизменной!

Обратите внимание, что это делает мелкую копию и идентично arr.copy() .

Реверсирование объекта

Вы можете использовать срезы, чтобы очень легко отменить str , list или tuple (или в основном любой объект коллекции, который реализует срез с параметром step). Ниже приведен пример изменения строки, хотя это в равной степени относится к другим типам, перечисленным выше:

s = 'reverse me!'
s[::-1]    # '!em esrever'

Давайте быстро посмотрим на синтаксис. [::-1] означает, что срез должен быть от начала до конца строки (поскольку start и end опущены), а шаг -1 означает, что он должен перемещаться по строке в обратном порядке.

Индексирование пользовательских классов: __getitem__, __setitem__ и __delitem__

class MultiIndexingList:
    def __init__(self, value):
        self.value = value
        
    def __repr__(self):
        return repr(self.value)
    
    def __getitem__(self, item):
        if isinstance(item, (int, slice)):
            return self.__class__(self.value[item])
        return [self.value[i] for i in item]
    
    def __setitem__(self, item, value):
        if isinstance(item, int):
            self.value[item] = value
        elif isinstance(item, slice):
            raise ValueError('Cannot interpret slice with multiindexing')
        else:
            for i in item:
                if isinstance(i, slice):
                    raise ValueError('Cannot interpret slice with multiindexing')
                self.value[i] = value
    
    def __delitem__(self, item):
        if isinstance(item, int):
            del self.value[item]
        elif isinstance(item, slice):
            del self.value[item]
        else:
            if any(isinstance(elem, slice) for elem in item):
                raise ValueError('Cannot interpret slice with multiindexing')
            item = sorted(item, reverse=True)
            for elem in item:
                del self.value[elem]

Это позволяет разрезать и индексировать доступ к элементу:

a = MultiIndexingList([1,2,3,4,5,6,7,8])
a
# Out: [1, 2, 3, 4, 5, 6, 7, 8]
a[1,5,2,6,1]
# Out: [2, 6, 3, 7, 2]
a[4, 1, 5:, 2, ::2]
# Out: [5, 2, [6, 7, 8], 3, [1, 3, 5, 7]]
#       4|1-|----50:---|2-|-----::2-----   <-- indicated which element came from which index

В то время как установка и удаление элементов допускает только разделенное целочисленное индексирование (без нарезки):

a[4] = 1000
a
# Out: [1, 2, 3, 4, 1000, 6, 7, 8]
a[2,6,1] = 100
a
# Out: [1, 100, 100, 4, 1000, 6, 100, 8]
del a[5]
a
# Out: [1, 100, 100, 4, 1000, 100, 8]
del a[4,2,5]
a
# Out: [1, 100, 4, 8]

Назначение среза

Еще одна опрятная функция с использованием срезов - это назначение срезов. Python позволяет назначать новые срезы для замены старых фрагментов списка за одну операцию.

Это означает, что если у вас есть список, вы можете заменить несколько членов в одном назначении:

lst = [1, 2, 3]
lst[1:3] = [4, 5]
print(lst) # Out: [1, 4, 5]

Назначение также не должно совпадать по размеру, поэтому, если вы хотите заменить старый фрагмент новым срезом, который отличается по размеру, вы можете:

lst = [1, 2, 3, 4, 5]
lst[1:4] = [6]
print(lst) # Out: [1, 6, 5]

Также можно использовать известный синтаксис разреза, чтобы делать такие вещи, как замена всего списка:

lst = [1, 2, 3]
lst[:] = [4, 5, 6]
print(lst) # Out: [4, 5, 6]

Или только последние два члена:

lst = [1, 2, 3]
lst[-2:] = [4, 5, 6]
print(lst) # Out: [1, 4, 5, 6]

Объекты среза

Срезы являются объектами сами по себе и могут храниться в переменных со встроенной функцией slice() . Переменные среза могут использоваться, чтобы сделать ваш код более читаемым и способствовать повторному использованию.

>>> programmer_1 = [ 1956, 'Guido', 'van Rossum', 'Python', 'Netherlands']
>>> programmer_2 = [ 1815, 'Ada', 'Lovelace', 'Analytical Engine', 'England']
>>> name_columns = slice(1, 3)
>>> programmer_1[name_columns]
['Guido', 'van Rossum']
>>> programmer_2[name_columns]
['Ada', 'Lovelace']

Базовая индексация

Списки Python основаны на 0, т. Е. К первому элементу в списке может обращаться индекс 0

arr = ['a', 'b', 'c', 'd']
print(arr[0])
>> 'a'

Вы можете получить второй элемент в списке по индексу 1 , третьему элементу по индексу 2 и так далее:

print(arr[1])
>> 'b'
print(arr[2])
>> 'c'

Вы также можете использовать отрицательные индексы для доступа к элементам в конце списка. например. index -1 даст вам последний элемент списка, а index -2 предоставит вам второй элемент списка:

print(arr[-1])
>> 'd'
print(arr[-2])
>> 'c'

Если вы попытаетесь получить доступ к индексу, которого нет в списке, будет IndexError :

print arr[6]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow