Статьи

Экскурсия по коллекциям Python

В этом уроке я собираюсь охватить несколько различных типов коллекций в Python.

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

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

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

Python предлагает несколько встроенных типов, которые подпадают под неопределенную категорию, называемую коллекциями. Хотя в Python нет формального типа, называемого collection , есть списки, отображения и наборы.

В этом уроке мы рассмотрим следующие типы:

  • списки
  • строки
  • словари
  • наборы

Список

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

Списки Python позволяют иметь неуникальные элементы.

Ниже приведен пример создания списка и добавления в него элементов:

 alist = ["item1", "item2", 4] 

Обратите внимание, что список неоднороден, содержит строковые и числовые типы.

Чтобы извлечь элемент из списка, просто обратитесь к его индексу. Списки Python имеют нулевую индексацию. Если я хочу последний элемент, который является позицией 3, мне нужно использовать индекс 2:

 alist[2] > 4 

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

Проверить длину списка можно с помощью команды len :

 len(alist)) > 3 

Чтобы добавить больше элементов в список, используйте функцию append() :

 alist.append(False) len(alist) > 4 

Мы увеличили список на единицу и добавили другой тип — логическое значение. Список не жалуется вообще.

Мы можем удалить элементы, вызвав remove() :

 alist.remove("item2") 

remove() не возвращает значение. Список будет обновлен и теперь содержит три элемента:

 ['item1', 4, False] 

Есть несколько других способов получить элементы из списка. Мы увидели, как получить доступ к элементу, используя его индекс. Если я получу доступ к индексу 2, я получу пункт 3:

 thevalue = alist[2] print(thevalue) > False 

Приведенный выше код предоставит нам копию предмета. Этот пункт все еще в списке. Общее количество списков не влияет.

Однако, если мы используем pop() , мы получаем элемент, но он также удаляется из списка:

 thevalue = alist.pop(1) print(thevalue) > 4 print("after pop", alist) > ['item1', False] 

Списки также могут быть отсортированы. Если у меня есть следующий список строк:

 alpha = ["z", "b", "a", "c"] 

вы можете отсортировать его с помощью команды sort() :

 alpha.sort() 

sort() не возвращает значение. Однако alpha сейчас отсортирована. Вы можете увидеть это, распечатав список:

 print(alpha) 

Элементы можно полностью изменить, вызвав reverse() :

 alpha.reverse() 

reverse() также не возвращает значение и обратит текущий список.

Является ли строка списком?

Строки имеют некоторые сходства со списками. Однако строки неизменяемы, а списки изменчивы.

Строки основаны на индексе как список. Вы также можете получить количество символов в строке, так же, как вы можете получить количество элементов в списке.

Например:

 mystring = "The quick brown fox." print(len(mystring)) > 20 print(mystring[4]) > q 

В отличие от списка, вы не можете добавить другой символ, добавив его. Вы также не можете обновить определенный элемент в строке.

Обратите внимание, что произойдет, если мы попытаемся присвоить символ определенной позиции в строке:

 mystring[4] = 'z' > TypeError: 'str' object does not support item assignment 

Это где неизменная часть строк вступает в игру.

В зависимости от строки мы можем преобразовать строку в список. Возьмите нашу переменную mystring сверху. Если мы split() строку, она по умолчанию будет split() на пробелы:

 stringlist = mystring.split() stringlist >['The', 'quick', 'brown', 'fox.'] type(stringlist) ><class 'list'> 

Каждое слово в строке становится элементом в списке. Мы также можем увидеть тип явно список.

Если строка не имеет пробелов, мы можем разделить ее. Но каков будет результат? Давайте проверим это:

 mystring2 = "Thequickbrownfox." stringlist2 = mystring2.split() stringlist2 type(stringlist2) >['Thequickbrownfox.'] ><class 'list'> 

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

Отображения

Сопоставления являются еще одним встроенным типом. Единственное сопоставление, доступное в Python — это словарь. Словари основаны на ключе / значении. В отличие от списка, основанного на индексах, мы не получаем доступ к значениям словаря с помощью индексов. Вместо этого мы получаем доступ к значениям с помощью ключей.

Создание словаря аналогично созданию списка за исключением добавления пар ключ / значение, а не отдельных элементов. Вот пример:

 mydictionary = {"item1":45, "item2":76, "item3":145} 

Каждый ключ / значение отделяется двоеточием. Первая часть является ключом, а вторая часть является значением. В первом элементе item1 — это ключ, а 45 — значение. Кроме того, обратите внимание, что мы используем скобки вместо скобок, чтобы заключить наши предметы.

При получении элементов из словаря мы думаем с точки зрения ключа, так как доступ через индекс невозможен. Если мы хотим item2 , мы используем:

 mydictionary["item2"] > 76 

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

 len(mydictionary) > 3 

Чтобы обновить item2 , мы используем следующее:

 mydictionary["item2"] = 100 

Добавление элемента соответствует синтаксису обновления:

 mydictionary["item62"] = 433 

item62 теперь существует в словаре, и общее количество увеличилось на единицу.

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

 del mydictionary["item2"] 

item2 теперь удален. Как видите, словарные операции довольно просты.

Как упоминалось ранее, словари имеют пары ключ / значение. Если вы хотите получить доступ только к ключам, вы можете сделать это:

 mydictionary.keys() > dict_keys(['item3', 'item1', 'item62']) 

К значениям обращаются одинаково:

 mydictionary.values() > dict_values([145, 45, 433]) 

наборы

Наборы — это неупорядоченные коллекции, которые не могут иметь повторяющихся элементов. Наборы не могут быть отсортированы. Метод sort() недоступен для множеств.

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

Чтобы создать набор, просто сделайте следующее:

 myset = {3,4,5,1} 

Или используйте метод set и укажите существующую структуру. Например:

 mylist = [0,1,5,4,3,7,6,6] myset = set(mylist) >{0, 1, 3, 4, 5, 6, 7} 

Поскольку наборы могут содержать только уникальные предметы, обратите внимание, что один из дубликатов 6 был удален. Использование set() отлично подходит для создания уникальной коллекции элементов из существующих данных.

Если я попытаюсь добавить 6 обратно, это не даст никакого эффекта:

 myset.add(6) >{0, 1, 3, 4, 5, 6, 7} 

Чтобы удалить элемент из набора, вы можете вызвать метод remove() :

 myset.remove(4) 

4 больше не в myset .

Наборы также не поддерживают индексацию. Попытка получить доступ к элементу в наборе бросков и ошибки:

 myset[2] >TypeError: 'set' object does not support indexing 

У наборов есть несколько уникальных методов. Если вы знакомы с математическими операциями над множествами (разность, пересечение и объединение), эти методы будут вам хорошо известны.

Начнем с difference() . Предположим, у меня есть эти два набора:

 set1 = {1,3,6,7} set2 = {1,3,6,8,10} 

При использовании set1 разница с set2 составляет 7 . 7 находится в set1 но не в set2 . В Python это выглядит следующим образом:

 set1.difference(set2) >{7} 

Чтобы пойти другим путем:

 set2.difference(set1) >{8, 10} 

Как насчет нахождения того, что является общим в двух наборах:

 set1.intersection(set2) >{1, 3, 6} 

И наконец, объедините оба набора, чтобы создать новый набор:

 set3 = set1.union(set2) >{1, 3, 6, 7, 8, 10} 

Набор объединения включает в себя все элементы из обоих наборов.

Резюме

Мы просмотрели списки Python, строки (хотя и не последовательность), словари и наборы. Мы рассмотрели конкретные операции и уникальные способности всех. Я надеюсь, что этот урок еще больше расширил ваши знания о коллекциях в Python.