Индексация списков

Индексация списков во многом аналогична индексации строк и выполняется с помощью оператора [START:STOP:STEP]:

>>> x = list('abcdefghi')
>>> x
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
>>>
>>> x[0], x[-1]    # извлечение первого и последнего элементов
('a', 'i')
>>>
>>> x[3], x[-5]    # извлечение произвольных элементов внутри списка
('d', 'e')
>>>
>>> x[2:5], x[-6:-1]    # извлечение срезов
(['c', 'd', 'e'], ['d', 'e', 'f', 'g', 'h'])
>>>
>>> x[1:-1:2]     # извлечение среза с заданным шагом
['b', 'd', 'f', 'h']

Более пристального внимания заслуживают случаи, когда внутри списков располагаются другие последовательности и коллекции.


Вложенные последовательности в списках

Под последовательностями в Python понимаются списки, кортежи и строки. Рассмотрим список x внутри которого имеется как строка так и еще один вложенный список:

>>> x = [7, 'abcdefg', [['A', 'B'], ['C', 'D']]]
>>>
>>> x
[7, 'abcdefg', [['A', 'B'], ['C', 'D']]]

Если нам нужен доступ к строке 'abcdefg', которая располагается на позиции с индексом \(1\) то извлечь ее можно так:

>>> x[1]
'abcdefg'

Однако, если нам нужно извлечь из данной строки символ 'a', который в строке 'abcdefg' расположен по индексу \(0\), то придется выполнить двойную индексацию, т.е. использовать два оператора [], в первом нужно указать позицию расположения строки, а во втором - позицию необходимого символа:

>>> x[1][0]
'a'

Выражение x[1] показывает, что в списке x индекс \(1\) ссылается на объект 'abcdefg', т.е. работая с выражением x[1] мы фактически работаем со строкой 'abcdefg':

>>> len(x[1])     # длина строки 'abcdefg'
7
>>>
>>> x[1].upper()     # использование строкового метода
'ABCDEFG'
>>>
>>> 'z' in x[1]     # использование оператора in
False
>>>
>>> x[1] += 'Z'     # конкатенация строк
>>> x[1]
'abcdefgZ'

Теперь давайте переключимся на вложенный список, который расположен в позиции с индексом \(2\):

>>> x
[7, 'abcdefgZ', [['A', 'B'], ['C', 'D']]]
>>>
>>> x[2]
[['A', 'B'], ['C', 'D']]

Если нам нужен подсписок ['C', 'D'], то его местоположение необходимо указать во втором операторе []:

>>>> x[2][1]
['C', 'D']

Наконец, если нам вдруг понадобится символ 'D', то его местоположение придется указывать уже в третьем операторе []:

>>> x[2][1][1]
'D'

Причем над x[2][1] и x[2][1][1] так же могут выполняться операции, соответствующие типам объектов на которые они ссылаются:

>>> x[2][1].append('E')    # добавить элемент в конец списка
>>>
>>> x[2][1][1] += 'DD'     # добавить к строке указанные символы
>>>
>>> x
[7, 'abcdefgZ', [['A', 'B'], ['C', 'DDD', 'E']]]

Если списки содержат вложенные последовательности, то для навигации по ним можно использовать последовательное указание операторов [].


Вложенные словари в списках

Словари позволяют получить доступ к своему элементу по соответствующему ключу, например:

>>> x = {'a': 1, 'c': 3, 'b': 2}     # создаем словарь
>>>
>>> x['c']    # получаем доступ к цифре 3
3

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

>>> x = [{1: 'a', 2: 'b'}, {'a': 10, 'b': 20}]
>>>
>>> x[0]     # доступ к первому словарю
{1: 'a', 2: 'b'}
>>>
>>> x[1]     #  доступ ко второму словарю
{'a': 10, 'b': 20}
>>>
>>> x[0][1]     # [1] - это ключ из первого словаря
'a'
>>>
>>> x[1]['a']     # ['a'] - это ключ из второго словаря
10

Поскольку словарь так же как и список является коллекцией, то его элементами могут быть любые объекты языка Python, т.е. они могут содержать как словари так и списки. В любом случае, получить доступ к необходимому элементу можно с помощью последовательного указания операторов []:

>>> x = [{'a': 1, 'b': [0, 1, 2, 3]}, {'a': {'a': 1, 'b': 2}, 'b': {'a': -1, 'b': -2}}]
>>>
>>> x[0]['a']
1
>>>
>>> x[0]['b'][1:3]
[1, 2]
>>>
>>> x[1]['a']['a']
1
>>>
>>> x[1]['b']['b']
-2