Python структура хранения данных

16. Структуры данных в Python

В предыдущем уроке мы научились генерировать случайные числа. Теперь стоит более глубоко разобраться с тем, какие структуры есть в Python. Ведь программирование – это в основном работа с данными, а чтобы ими эффективнее манипулировать, необходимо их где-то хранить. Это «где-то» и есть структуры.

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

var1 = "Hello"
var1 = 12
print(var1)

Одной из особенностей переменных и типов в Python является возможность динамически присваивать значение переменной. Это сильно упрощает написание и понимание кода. В примере выше мы сначала в переменную var1 добавили строку, а затем число и вывели результат. Например, в типизированном языке С++ так делать нельзя: во-первых, мы сначала должны были объявить эти переменные. Во-вторых, в переменную строкового типа нельзя добавить число. Аналогичный код на С++ выглядел бы так (причем 12 уже является строкой, а не числом):

string var1 = "Hello"; 
var1 = "12";
cout

В Python все является объектами: числа, строки, функции, модули и т.д. Следовательно, любой объект можно присвоить переменной. Теперь самое время обсудить, как хранить эти объекты.

В Python есть четыре встроенных структуры данных, которые вы можете использовать для хранения данных: список, картеж, словарь и множество. Под «встроенными» понимается отсутствие необходимости подключать специальные модули.

Список

В Python списки очень похожи на массивы в других языках программирования. Они так же нумеруются с нуля. Но в отличии от того же С++, количество элементов в списке Python’а может динамически изменяться по необходимости. Те, кто знакомы с С++, могли заметить аналогию с контейнером vector из библиотеки STL. Если для вас все вышеназванные понятия в абзаце оказались новыми, не волнуйтесь, сейчас все будет понятно. Массив – это набор элементов, идентифицируемых по индексу. Рассмотрим пример:

people = ["Иван Иванов", "Петр Петров"]

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

Подробнее поговорим о списках начиная с урока 6.1.

Как мы уяснили, список являются изменяемой структурой, что не скажешь о следующей.

Кортеж

Кортеж – это тоже список, но его нельзя изменить. У многих возникает вопрос: «Зачем нужны неизменяемые списки?». Иногда случаются такие ситуации, когда нам необходимо быть уверенным в том, что список не изменится. Мы еще часто будем встречаться с картежами в дальнейшем.

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

Подробнее поговорим о кортежах начиная с урока 9.1.

Словарь

Если порядок не важен, то нам может помочь структура под названием «Словарь». Словари в Python хранят коллекции в виде пар ключ/значение. То есть каждому уникальному ключу соответствует значение (необязательно уникальное). Таких пар может быть произвольное количество. Словари, как и списки, являются динамическими и изменяемыми. Для тех, кто знаком с другими языками программирования, словарь в Python можно сравнить с ассоциативным массивом (в С++ на него похож контейнер map ). В уроке, посвященном словарям, мы научимся не только с ними работать, но и сортировать как по ключу, так и по значению.

Подробнее поговорим о словарях начиная с урока 7.1.

Множество

Последней встроенной структурой является множество. Оно отлично помогает, когда необходимо удалить все повторяющиеся элементы. Множества могут изменяться динамически, как списки и словари. Множества является неупорядоченной структурой, как и словарь. В С++ на него похож контейнер set .

Подробнее поговорим о множествах начиная с урока 8.1.

Заключение

Обозреть все структуры было необходимо, чтобы вы смогли лучше структурировать свои знания в дальнейшем, когда будете более подробно знакомиться с ними.

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

Источник

Python структура хранения данных

Как и в любом языке программирования в Python существует несколько типов структур данных, это:

Списки

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

Создание объекта списка происходит так:

A=list() # пустой список B=[] #пустой список C=[12,13] # список из элементов [12, 13] 

добавление и удаление элемента в/из списка происходит следующим образом:

A.append(1) # A=[1] B=B+[1] #B=[1] C.insert(1,2)# C=[12, 2, 13] # удаление первого вхождения элемента в список C.remove(13)# C=[12,2] # доступ к элементу списка по индексу print(C[0]) # 12 # срез списка print(C[0:1])# 12 # удаление элемента по его индексу del C[0] #C=[2] 

Надо сказать, что все операции так называемые in place, то есть в результате ничего не возвращается и новый список не создается.

Чтобы добавить несколько элементов в список можно использовать оператор + , как в строке 2 B = B + [ 1 , 2 , 3 , 4 , 5 ] , тогда если изначальный список был B = [ 0 , 5 ] , то посте операции он станет B = [ 0 , 5 , 1 , 2 , 3 , 4 , 5 ] . Важно!! если вы используете B . append ([ 1 , 2 , 3 , 4 , 5 ]) , то получите B = [ 0 , 5 ,[ 1 , 2 , 3 , 4 , 5 ]] , то есть добавите список как объект в список. Чтобы результат был идентичен, вместо append нужно использовать extend: B . extend ([ 1 , 2 , 3 , 4 , 5 ]) .

Также список поддерживает методы очистки clear () и сортировки sort () .

A.append(1) # A=[1] A=A+[1,2,5,6,3] #B=[1,1,2,5,6,3] A.sort() #A=[1,1,2,3,5,6] A.clear() #A=[] 

Срез списка задается в формате A[N:M], при этом элемент с номером N включается в срез, а M - нет.

Для проверки наличия элемента в списке существует оператор in , пример:

A.append(1) # A=[1] A=A+[1,2,5,6,3] #B=[1,1,2,5,6,3] 1 in A # True 10 in A # False 

Пример «список четных чисел»

Создадим список, содержащий все четные числа от нуля до некоторого N

A=[] N=10 for i in range(N): if i%2==0: A.append(i) print(A) >>[0, 2, 4, 6, 8] 

Массивы

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

Конструктор массивов имеет формат:

array . array ( typecode ,[ initializer ])

На 64-битной машине размер элементов в байтах будет следующим

Type code C Type Python type Minimum size in bytes
‘b’ signed char int 1
‘B’ unsigned char int 1
‘u’ Py_UNICODE Unicode character 2
‘h’ signed short int 2
‘H’ unsigned short int 2
‘i’ signed int int 4
‘I’ unsigned int int 4
‘l’ signed long int 8
‘L’ unsigned long int 8
‘q’ signed long long int 8
‘Q’ unsigned long long int 8
‘f’ float float 4
‘d’ double float 8
import array a=array.array('i',[1,2,3,4]) # создаем массив двубайтовых целых чисел a[1]=12 print(a) >> array('i',[1,12,3,4]) 

Массивы поддерживают те же операции, что и списки

Кортежи

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

A=tuple() # пустой кортеж B=()#пустой кортеж C=(12,13) # кортеж из элементов (12, 13) 

И соответственно кортеж не поддерживает операции добавления, сортировки, вставки, удаления, расширения. Среди поддерживаемых операций - конкатенация

A=tuple() # пустой кортеж A=A+(1,) #A=(1,) 

Здесь стоит отметить, что в отличие от списка, где новый элемент просто добавляется в конец, происходит создание нового объекта.

A=list() # пустой список B=A # список B и список A указывают на один и тот же объект B==A # True A=A+[1] B==A # True Ничего не изменилось, ссылка на объект осталась прежней, A и B идентичны A=tuple() # пустой кортеж B=A # кортеж B и кортеж A указывают на один и тот же объект B==A # True A=A+(1,) B==A # False Объект A - новый объект 

Для кортежей доступ к элементу и выполнение срезов эквивалентно спискам, отсутствует лишь возможность изменять кортеж.

Для проверки наличия элемента в кортеже все аналогично спискам.

Словари

Словари или ассоциативные массивы - это еще один способ представления данных, отличие словаря от списка в том, что индексами могут быть не только целые числа, но и любые объекты Python. В случае индексов - любые hashable объекты.

Создать ассоциативный массив просто:

A=dict() # пустой словарь B=<> # то же самое С="A":0.1, "B":0> # словарь с двумя элементами "A"=>0.1, "B"=>0 

Чтобы поместить значение в ассоциативный массив, достаточно присвоить значение выбранному индексу, например B [ 10 ] = 'Hello' или B [ "12" ] = 12 .

Из этих примеров видно, что индекс может быть действительно любым объектом, равно как и присваиваемое значение.

У словаря есть два важных метода: keys() и values() . Первый возвращает список ключей, второй - список значений.

В случае словаря B , при вызове B.keys() мы получим [10, "12"] , а при вызове B.values() - ['Hello', 12]

Важно

При добавлении элементов в список, кортеж или словарь имейте ввиду, для atomic (immutable) и basic типов, создается ссылка на новый объект и помещается в словарь, для остальных объектов в словарь помещается ссылка на существующий объект. Если он в дальнейшем изменяется, то изменяется и содержимое словаря, кортежа, списка.

import array A=dict() # созадим словарь B=[] # список val=[1,2,3] arr=array.array('d',[1,2,3]) A['1']=arr A[2]=val B.append(val) B.append(arr) В=(val, arr, ) print(A, '\n', B,'\n',D) >> '1': array('d', [1.0, 2.0, 3.0]), 2: [1, 2, 3]> >> [[1, 2, 3], array('d', [1.0, 2.0, 3.0])] >> ([1, 2, 3], array('d', [1.0, 2.0, 3.0]),) arr[0]=12 val.append('1') print(A, '\n', B,'\n',D) >>'1': array('d', [12.0, 2.0, 3.0]), 2: [1, 2, 3, '1']> >> [[1, 2, 3, '1'], array('d', [12.0, 2.0, 3.0])] >> ([1, 2, 3, '1'], array('d', [12.0, 2.0, 3.0]),) 

Как видите, изменение ссылочного объекта вне словаря/списка/кортежа ведет к изменению его в словаре/списке/кортеже

Множества

Это динамическая структура, содержащая уникальные значения. Множество может содержать лишь hashable объекты. Определяется так:

Поддерживает все операции над множествами: включение, исключение, пересечение, объединение.

# пусть имеем два множества a = 1,2,3> b = 2,3,4> # да-да, перечисление элементов в фигурных скобках означает инициализацию множества a.difference(b) >> 1> b.difference(a) >> 4> a.union(b) >> 1,2,3,4> a.intersection(b) >> 2,3> a.issubset(b), a.issuperset(b) >> False, False a.symmetric_difference(b) >> 1,4> 

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

Или в задачах где заведомо требуется уникальность каждого элемента в списке.

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

a = [1,2,3,4,3,2,3,2,3,4] b = set(a) print(b) >> 1,2,3,4> 

Источник

Читайте также:  Text to html converters
Оцените статью