Курс: Python

Лекция: Списки, множества, словари, массивы

Списки в питоне

После изучения строк перейдем к спискам — в питоне это один из самых используемых типов данных. Они отдаленно напоминают массивы в Java или C — это тоже упорядоченный список объектов. В частности, аналогию можно провести с массивом в Java — с классом Vector, который способен содержать произвольные объекты. Питоновские списки можно также сравнить с массивами на языке Perl. По своей мощи, гибкости, простоте использования список превосходит аналоги из других языков программирования.

Как и для строк, для списков нумерация индексов начинается с нуля. Для списка можно получить срез, объединить несколько списков и так далее:

lst = ['банан', 'кокос', 100, 1234]
print (lst[1:3]) # ['кокос', 100]

Для создания копии списка нужно сделать выборку x = y[:] иначе обе переменные будут ссылками на один и тот же список. Пример:

x = [7,8,9]
y = x
z = x[:]
y[1] = 0
print(x) # [7,0,9]
print(z) # [7,8,9]

Конкатенация при помощи + добавляет второй список в конец первого. Умножение списка на целое число * дублирует элементы списка:

x = [7,8,9]
y = [1,2,3]
print(x+y*2) # [7, 8, 9, 1, 2, 3, 1, 2, 3]

Задание 5.1. Упорядочивание списка

Дан список. Сформировать новый список, в котором идут сначала отрицательные элементы, затем нули, затем положительные. Пример:

x = [0,1,-3,5,0,-5,2]
y = [-3,-5,0,0,1,5,2]

Списки имеют большой набор функций: append , extend — добавление; insert — вставка; index — найти индекс первого вхождения конкретного элемента; count — подсчет повторов элемента; remove , del — удаление элемента; sort — сортировка; reverse — реверс; pop — извлечение элемента; len — длина списка; max — максимальный элемент; min — минимальный элемент; оператор in — проверка элемента на вхождение.

Добавлять можно как одинарные элементы, так и набор элементов. Списки могут быть вложенными — вложенный список добавим в конец с помощью append():

lst = [1, 'guitar', 'microphone', 2, 100, 'piano']
lst2 = ['sintezator','drums']
lst.append(lst2)
print(lst) # [1, 'guitar', 'microphone', 2, 100, 'piano', ['sintezator', 'drums']]

Кортежи (Tuple)

Список так же может быть неизменяемым (immutable), как и строка, в этом случае он называется кортеж (tuple). Кортеж использует меньше памяти, чем список. Кортеж вместо квадратных скобок использует круглые (хотя можно и совсем без скобок). Кортеж не допускает изменений, в него нельзя добавить новый элемент, хотя он может содержать объекты, которые можно изменить:

t = 1,[2,3]
print (t) #(1, [2, 3])
t[1] = 2 # ошибка
t[1].append(4)
print (t) #(1, [2, 3, 4])

Доступные методы

В каких случаях использовать? Для хранения данных вместо списка (если они не предполагают изменений).

Сеты, множества (Set)

Сеты — неотсортированная коллекция уникальных элементов. Сеты поддерживают итерацию, добавление и удаление объектов и т.д. Индексация и срезы в сетах не поддерживаются. Над сетами можно выполнять разные операции, например:

s1 = {3,2,3,1,7}
s2 = {5,6,7,2}
print (s1 | s2) # {1, 2, 3, 5, 6, 7}
print (s1 - s2) # {1, 3}
print (s1 & s2) # {2, 7}
for i in s1:
    print(i) # перебор элементов сета

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

L = [1,2,3,4,1,2,6,7]
print (set(L)) # {1, 2, 3, 4, 6, 7}
L = list(set(L))
print (L) # [1, 2, 3, 4, 6, 7]

Задание 5.2. Девушки программисты

Задать два множества: множество имен девушек и множество имен программистов. Нужно получить множество имен девушек программистов.

Словари

В некоторых языках, словари могут упоминаться как ассоциативная память, или ассоциативные массивы. Они индексируются при помощи ключей, которые могут быть любого неизменяемого типа. Например, строка или число могут быть ключом. Вам обязательно стоит запомнить тот факт, что словарь – это неупорядоченный набор пар ключ:значение, и ключи обязательно должны быть уникальными. Вы можете получить список ключей путем вызова метода keys() в том или ином словаря. Чтобы проверить, присутствует ли ключ в словаре, вы можете использовать ключ in в Python.

my_other_dict = {"one":1, "two":2, "three":3}
print(my_other_dict) # {'three': 3, 'two': 2, 'one': 1}

Пример работы со словарем:

Capitals = dict()

# Заполним его несколькими значениями
Capitals['Russia'] = 'Moscow'
Capitals['Ukraine'] = 'Kiev'
Capitals['USA'] = 'Washington'

Countries = ('Russia', 'France', 'USA', 'Russia')

for country in Countries:
    # Для каждой страны из списка проверим, есть ли она в словаре Capitals
    if country in Capitals:
        print('Столица страны ' + country + ': ' + Capitals[country])
    else:
        print('В базе нет страны c названием ' + country)

Задание 5.3. Частотность символов

Запросите у пользователя строку и посчитайте количество каждого символа в строке.

Модуль array. Массивы в python

Модуль array определяет массивы в python. Массивы очень похожи на списки, но с ограничением на тип данных и размер каждого элемента.

Класс array.array(TypeCode [, инициализатор]) - новый массив, элементы которого ограничены TypeCode, и инициализатор, который должен быть списком, объектом, который поддерживает интерфейс буфера, или итерируемый объект. array.typecodes - строка, содержащая все возможные типы в массиве. Массивы изменяемы. Массивы поддерживают все списковые методы (индексация, срезы, умножения, итерации), и другие методы.

Задание 5.4. Задание для японского кроссворда

По картинке составить задание для японского кроссворда. (Длины секторов меньше 10.) Пример работы:

Высота: 5
Ширина: 5
строка1: 01000
строка2: 00000
строка3: 01000
строка4: 01011
строка5: 11110
Результат:
   1
  13121
 1.....
  .....
 1.....
12.....
 4.....