Списки как структуры данных

Андрей К…
Последнее изменение:
0
0
0

Списки (list)

Если переменная одна, то её можно легко и просто объявить. А что если их несколько? Если нужно 100 или 200? Руками сложно набивать. Для этих целей, если не требуется что-то узкоспециализированное, используются встроенные структуры данных. Сегодня поговорим о списке (он же массив).
Объявление и получение доступа к данным
Массив, это структура данных, где переменные хранятся последовательно, у них нет имен, к ним можно обратиться по порядковому номеру хранения.
Например, у нас есть 10 пчел, у каждой есть свое имя. Создадим массив для хранения имен пчел.

bees_list = [
    "Варвара", "Степанида", "Фёкла", "Марья", "Кузьминишна",
    "Семённа", "Прасковья", "Радмила", "Таруся", "Антонина", 
]


Массив объявляется квадратными скобками [], и внутри него могут храниться данные любых типов. Внутри квадратных скобок пробелы и табуляции не играют роли, так что можете позиционировать текст любым способом, что сочтете нужным.
Для того, что бы получить значение, нужно обратиться к массиву и указать позицию/индекс/отступ от края. Например, первое значение находится с отступом 0:

print(bees_list[0]) # Варвара
print(bees_list[1]) # Степанида
print(bees_list[9]) # Антонина


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

print(bees_list[-1]) # Антонина
print(bees_list[-2]) # Таруся


Так же для доступа к элементам массива можно воспользоваться нотацией срезов: список[начало:окончание:шаг]. И не обязательно каждый из них указывать.
Например: Получить все элементы массива, которые расположены после третьего (Фёклы, в нашем случае):

print(bees_list[3:])
['Марья', 'Кузьминишна', 'Семённа', 'Прасковья', 'Радмила', 'Таруся', 'Антонина']


Получить все элементы массива, которые расположены после третьего, но не доходя девятого( Таруси):

print(bees_list[3:8])
['Марья', 'Кузьминишна', 'Семённа', 'Прасковья', 'Радмила']


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

print(bees_list[3:8:2])
['Марья', 'Семённа', 'Радмила']


Получить каждый третий элемент всего массива:

print(bees_list[::3])
['Варвара', 'Марья', 'Прасковья', 'Антонина']


Получить каждый четный элемент всего массива:

print(bees_list[1::2])
['Степанида', 'Марья', 'Семённа', 'Радмила', 'Антонина']


И так далее.


Реклама



Встроенные функции списков:


append – добавление данных.


Если нам нужно программно добавлять значения в конец массива, нам поможет функция append.
Например, давайте добавим в улей трутней. У них не будет особенных имен, но будут порядковые номера.

bees_list = [
    "Варвара", "Степанида", "Фёкла", "Марья", "Кузьминишна",
    "Семённа", "Прасковья", "Радмила", "Таруся", "Антонина", 
]
# В цикле 10 раз
for i in range(10):
    # Добавим к конец массива трутня
    bees_list.append("Трутень " + str(i))

print(bees_list)


extend – расширить список другим списком (или чем-то похожим)

bees_list = [
    "Варвара", "Степанида", "Фёкла", "Марья", "Кузьминишна",
    "Семённа", "Прасковья", "Радмила", "Таруся", "Антонина", 
]
# В цикле 10 раз
for i in range(10):
    # Добавим к конец массива трутня
    bees_list.append("Трутень " + str(i))

print(bees_list)
# В отдельном списке у нас хранятся пчелиные матки
queens = ['Королева Эльвира', 'Королева Брагиня']
# Совместим два списка
bees_list.extend(queens)

print(bees_list)

 


 
К списку bees_list мы добавили список queens. Впрочем, могли бы добавить что-угодно, например строку – Питон прошелся бы по каждому символу в строке и добавил бы его в конец списка.


Insert(позиция, значение) – вставить в указанную позицию


Если требуется вставить значение в определенное место списка, указываем позицию и значение, например, что бы вставить в самое начало, напишем

bees_list.insert(0, "Пасечник Геннадий")


remove – удалить элемент из массива


Этот метод удаляет первый найденный элемент из массива, который совпадает с нужным, и ругается, если не удалось. Т.е. если бы в нашем массиве было 20 Геннадиев, и мы бы вызвали

bees_list.remove(Геннадий)


то удалился бы только первый, а остальные остались. Если бы Геннадиев не нашлось, выбросилось бы исключение ValueError: list.remove(x): x not in list – сообщение о том, что выполнить команду не удалось.

pop([индекс]) – забрать элемент из массива


Когда мы вызываем этот метод, указанный элемент по индексу удаляется из массива, и значение возвращается.
Например, заберем пасечника.

bees_list = [
    "Варвара", "Степанида", "Фёкла", "Марья", "Кузьминишна",
    "Семённа", "Прасковья", "Радмила", "Таруся", "Антонина", 
]
# В цикле 10 раз
for i in range(10):
    # Добавим к конец массива трутня
    bees_list.append("Трутень " + str(i))

# В отдельном списке у нас хранятся пчелиные матки
queens = ['Королева Эльвира', 'Королева Брагиня']
# Совместим два списка
bees_list.extend(queens)

bees_list.insert(0, "Пасечник Геннадий")

tsar = bees_list.pop(0)
print("Главный - ", tsar)
print(bees_list)


Если не указывать индекс, то берется последний элемент из списка 


clear – целиком очищает список от значений


index(значение) – возвращает позицию элемента.


Например, если нам интересно, в какой соте сидит трутень №2, мы сделаем такой запрос:

bees_list = [
    "Варвара", "Степанида", "Фёкла", "Марья", "Кузьминишна",
    "Семённа", "Прасковья", "Радмила", "Таруся", "Антонина", 
]
# В цикле 10 раз
for i in range(10):
    # Добавим к конец массива трутня
    bees_list.append("Трутень " + str(i))

# В отдельном списке у нас хранятся пчелиные матки
queens = ['Королева Эльвира', 'Королева Брагиня']
# Совместим два списка
bees_list.extend(queens)

bees_list.insert(0, "Пасечник Геннадий")

tsar = bees_list.pop(0)
print("Трутень №2 сидит в соте №", bees_list.index('Трутень 2'))


Если одинаковых значений несколько, вернется первое.


 
count(значение) – подсчет количества определенных одинаковых значений массива


sort – отсортировать массив


если сделать bees_list.sort() то все элементы массива выстроятся по порядку (в данном случае, по алфавиту). 
Можно передать параметр bees_list.sort(reverse=True), тогда они выстроятся в обратном порядке. Тоже самое можно сделать, вызвав функцию bees_list.reverse()


Ну и конечно узнать длину списка можно с помощью функции len(список). Например len(bees_list)


Реклама



Вложенность списков


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

hives = [ # Общий массив, в котором хранятся ульи
    [ # Улей 1
        [ # Любимые цветы пчелы 1
            'Лютик'
        ],
        [ # Любимые цветы пчелы 2
            'Тюльпан',
            'Лилия'
        ]
    ], 
    [ # Улей 2
        [], # Любимые цветы пчелы 1
        [], # Любимые цветы пчелы 2
        []  # Любимые цветы пчелы 3
    ]  
]

print("Общая инфа", hives)
print("Только улей 1", hives[0])
print("Только улей 1, пчела №2", hives[0][1])
print("Только улей 1, пчела №2, цветок №1:", hives[0][1][1])


Мы составили такую структуру, и можем обратиться к любому её элементу:


 


Реклама


Генераторы списков


Этот раздел немного забегает вперед, но так как он имеет прямое отношение к спискам, рассмотрим его здесь.
Списки можно генерировать и/или фильтровать на лету, используя специальный синтаксис. Например, вернемся к нашим пчелам и предположим, что нам зачем-то понадобились все пчелы, у которых имя длиннее 6 символов. 
Можно, конечно, пройтись в цикле по списку и оставить только нужные значения, но можно воспользоваться «синтаксическим сахаром» и выполнить такую команду:

bees_list = [
    "Варвара", "Степанида", "Фёкла", "Марья", "Кузьминишна",
    "Семённа", "Прасковья", "Радмила", "Таруся", "Антонина", 
]

long_names_list = [name for name in bees_list if len(name) > 6]
print(long_names_list)


Это по сути более короткий код для такого синтаксиса:

long_names_list = []
for name in bees_list:
    if len(name) > 6:
        long_names_list.append(name)

print(long_names_list)


Результат будет тот же, но строк меньше. 

Нет комментариев
Пожалуйста, Авторизуйтесь что бы оставить свой комментарий