Python Orientado a Objetos - Estruturas de Dados

As estruturas de dados Python são muito intuitivas do ponto de vista da sintaxe e oferecem uma grande variedade de operações. Você precisa escolher a estrutura de dados Python, dependendo do que os dados envolvem, se eles precisam ser modificados ou se são dados fixos e qual tipo de acesso é necessário, como no início / fim / aleatório etc.

Listas

Uma lista representa o tipo mais versátil de estrutura de dados em Python. Uma lista é um contêiner que contém valores separados por vírgulas (itens ou elementos) entre colchetes. As listas são úteis quando queremos trabalhar com vários valores relacionados. Como as listas mantêm os dados juntos, podemos executar os mesmos métodos e operações em vários valores ao mesmo tempo. Os índices das listas começam em zero e, ao contrário das strings, as listas são mutáveis.

Estrutura de Dados - Lista

>>>
>>> # Any Empty List
>>> empty_list = []
>>>
>>> # A list of String
>>> str_list = ['Life', 'Is', 'Beautiful']
>>> # A list of Integers
>>> int_list = [1, 4, 5, 9, 18]
>>>
>>> #Mixed items list
>>> mixed_list = ['This', 9, 'is', 18, 45.9, 'a', 54, 'mixed', 99, 'list']
>>> # To print the list
>>>
>>> print(empty_list)
[]
>>> print(str_list)
['Life', 'Is', 'Beautiful']
>>> print(type(str_list))
<class 'list'>
>>> print(int_list)
[1, 4, 5, 9, 18]
>>> print(mixed_list)
['This', 9, 'is', 18, 45.9, 'a', 54, 'mixed', 99, 'list']

Acessando itens na lista Python

Cada item de uma lista é atribuído a um número - que é o índice ou posição desse número. A indexação sempre começa do zero, o segundo índice é um e assim por diante. Para acessar os itens em uma lista, podemos usar esses números de índice entre colchetes. Observe o seguinte código, por exemplo -

>>> mixed_list = ['This', 9, 'is', 18, 45.9, 'a', 54, 'mixed', 99, 'list']
>>>
>>> # To access the First Item of the list
>>> mixed_list[0]
'This'
>>> # To access the 4th item
>>> mixed_list[3]
18
>>> # To access the last item of the list
>>> mixed_list[-1]
'list'

Objetos Vazios

Objetos vazios são os tipos integrados de Python mais simples e básicos. Nós os usamos várias vezes sem perceber e os estendemos a todas as classes que criamos. O principal objetivo de escrever uma classe vazia é bloquear algo por enquanto e, posteriormente, estender e adicionar um comportamento a ele.

Adicionar um comportamento a uma classe significa substituir uma estrutura de dados por um objeto e alterar todas as referências a ele. Portanto, é importante verificar os dados, se se trata de um objeto disfarçado, antes de criar qualquer coisa. Observe o seguinte código para melhor compreensão:

>>> #Empty objects
>>>
>>> obj = object()
>>> obj.x = 9
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
obj.x = 9
AttributeError: 'object' object has no attribute 'x'

Então, de cima, podemos ver que não é possível definir nenhum atributo em um objeto que foi instanciado diretamente. Quando o Python permite que um objeto tenha atributos arbitrários, é necessária uma certa quantidade de memória do sistema para controlar quais atributos cada objeto possui, para armazenar o nome do atributo e seu valor. Mesmo que nenhum atributo seja armazenado, uma certa quantidade de memória é alocada para novos atributos potenciais.

Portanto, Python desabilita propriedades arbitrárias no objeto e em vários outros recursos internos, por padrão.

>>> # Empty Objects
>>>
>>> class EmpObject:
    pass
>>> obj = EmpObject()
>>> obj.x = 'Hello, World!'
>>> obj.x
'Hello, World!'

Portanto, se quisermos agrupar propriedades, podemos armazená-las em um objeto vazio, conforme mostrado no código acima. No entanto, esse método nem sempre é sugerido. Lembre-se de que classes e objetos devem ser usados ​​apenas quando você deseja especificar dados e comportamentos.

Tuplas

Tuplas são semelhantes a listas e podem armazenar elementos. No entanto, eles são imutáveis, portanto, não podemos adicionar, remover ou substituir objetos. Os principais benefícios que a tupla oferece por causa de sua imutabilidade é que podemos usá-los como chaves em dicionários ou em outros locais onde um objeto requer um valor hash.

Tuplas são usadas para armazenar dados, e não comportamento. No caso de você precisar de comportamento para manipular uma tupla, você precisa passar a tupla para uma função (ou método em outro objeto) que executa a ação.

Como a tupla pode atuar como uma chave de dicionário, os valores armazenados são diferentes uns dos outros. Podemos criar uma tupla separando os valores com uma vírgula. As tuplas estão entre parênteses, mas não são obrigatórias. O código a seguir mostra duas atribuições idênticas.

>>> stock1 = 'MSFT', 95.00, 97.45, 92.45
>>> stock2 = ('MSFT', 95.00, 97.45, 92.45)
>>> type (stock1)
<class 'tuple'>
>>> type(stock2)
<class 'tuple'>
>>> stock1 == stock2
True
>>>

Definindo uma Tupla

As tuplas são muito semelhantes à lista, exceto que todo o conjunto de elementos é colocado entre parênteses em vez de colchetes.

Assim como quando você divide uma lista, você obtém uma nova lista e quando você corta uma tupla, você obtém uma nova tupla.

>>> tupl = ('Tuple','is', 'an','IMMUTABLE', 'list')
>>> tupl
('Tuple', 'is', 'an', 'IMMUTABLE', 'list')
>>> tupl[0]
'Tuple'
>>> tupl[-1]
'list'
>>> tupl[1:3]
('is', 'an')

Métodos Python Tuple

O código a seguir mostra os métodos em tuplas Python -

>>> tupl
('Tuple', 'is', 'an', 'IMMUTABLE', 'list')
>>> tupl.append('new')
Traceback (most recent call last):
   File "<pyshell#148>", line 1, in <module>
      tupl.append('new')
AttributeError: 'tuple' object has no attribute 'append'
>>> tupl.remove('is')
Traceback (most recent call last):
   File "<pyshell#149>", line 1, in <module>
      tupl.remove('is')
AttributeError: 'tuple' object has no attribute 'remove'
>>> tupl.index('list')
4
>>> tupl.index('new')
Traceback (most recent call last):
   File "<pyshell#151>", line 1, in <module>
      tupl.index('new')
ValueError: tuple.index(x): x not in tuple
>>> "is" in tupl
True
>>> tupl.count('is')
1

A partir do código mostrado acima, podemos entender que as tuplas são imutáveis ​​e, portanto -

  • Vocês cannot adicione elementos a uma tupla.

  • Vocês cannot anexar ou estender um método.

  • Vocês cannot remove elementos de uma tupla.

  • Tuplas têm no remover ou pop método.

  • Contagem e índice são os métodos disponíveis em uma tupla.

Dicionário

Dicionário é um dos tipos de dados integrados do Python e define relacionamentos um-para-um entre chaves e valores.

Definindo Dicionários

Observe o código a seguir para entender como definir um dicionário -

>>> # empty dictionary
>>> my_dict = {}
>>>
>>> # dictionary with integer keys
>>> my_dict = { 1:'msft', 2: 'IT'}
>>>
>>> # dictionary with mixed keys
>>> my_dict = {'name': 'Aarav', 1: [ 2, 4, 10]}
>>>
>>> # using built-in function dict()
>>> my_dict = dict({1:'msft', 2:'IT'})
>>>
>>> # From sequence having each item as a pair
>>> my_dict = dict([(1,'msft'), (2,'IT')])
>>>
>>> # Accessing elements of a dictionary
>>> my_dict[1]
'msft'
>>> my_dict[2]
'IT'
>>> my_dict['IT']
Traceback (most recent call last):
   File "<pyshell#177>", line 1, in <module>
   my_dict['IT']
KeyError: 'IT'
>>>

Pelo código acima, podemos observar que:

  • Primeiro criamos um dicionário com dois elementos e o atribuímos à variável my_dict. Cada elemento é um par de valor-chave e todo o conjunto de elementos está entre chaves.

  • O número 1 é a chave e msfté o seu valor. Similarmente,2 é a chave e IT é o seu valor.

  • Você pode obter valores por chave, mas não vice-versa. Portanto, quando tentamosmy_dict[‘IT’] , isso levanta uma exceção, porque IT não é uma chave.

Modificando Dicionários

Observe o código a seguir para entender como modificar um dicionário -

>>> # Modifying a Dictionary
>>>
>>> my_dict
{1: 'msft', 2: 'IT'}
>>> my_dict[2] = 'Software'
>>> my_dict
{1: 'msft', 2: 'Software'}
>>>
>>> my_dict[3] = 'Microsoft Technologies'
>>> my_dict
{1: 'msft', 2: 'Software', 3: 'Microsoft Technologies'}

Pelo código acima, podemos observar que -

  • Você não pode ter chaves duplicadas em um dicionário. Alterar o valor de uma chave existente excluirá o valor antigo.

  • Você pode adicionar novos pares de valores-chave a qualquer momento.

  • Os dicionários não têm conceito de ordem entre os elementos. Eles são coleções simples não ordenadas.

Mistura de tipos de dados em um dicionário

Observe o código a seguir para entender como misturar tipos de dados em um dicionário -

>>> # Mixing Data Types in a Dictionary
>>>
>>> my_dict
{1: 'msft', 2: 'Software', 3: 'Microsoft Technologies'}
>>> my_dict[4] = 'Operating System'
>>> my_dict
{1: 'msft', 2: 'Software', 3: 'Microsoft Technologies', 4: 'Operating System'}
>>> my_dict['Bill Gates'] = 'Owner'
>>> my_dict
{1: 'msft', 2: 'Software', 3: 'Microsoft Technologies', 4: 'Operating System',
'Bill Gates': 'Owner'}

Pelo código acima, podemos observar que -

  • Não apenas strings, mas o valor do dicionário pode ser de qualquer tipo de dados, incluindo strings, inteiros, incluindo o próprio dicionário.

  • Ao contrário dos valores do dicionário, as chaves do dicionário são mais restritas, mas podem ser de qualquer tipo, como strings, inteiros ou qualquer outro.

Exclusão de itens de dicionários

Observe o código a seguir para entender sobre como excluir itens de um dicionário -

>>> # Deleting Items from a Dictionary
>>>
>>> my_dict
{1: 'msft', 2: 'Software', 3: 'Microsoft Technologies', 4: 'Operating System',
'Bill Gates': 'Owner'}
>>>
>>> del my_dict['Bill Gates']
>>> my_dict
{1: 'msft', 2: 'Software', 3: 'Microsoft Technologies', 4: 'Operating System'}
>>>
>>> my_dict.clear()
>>> my_dict
{}

Pelo código acima, podemos observar que -

  • del - permite excluir itens individuais de um dicionário por tecla.

  • clear - exclui todos os itens de um dicionário.

Jogos

Set () é uma coleção não ordenada sem elementos duplicados. Embora os itens individuais sejam imutáveis, o próprio conjunto é mutável, ou seja, podemos adicionar ou remover elementos / itens do conjunto. Podemos realizar operações matemáticas como união, interseção etc. com conjunto.

Embora os conjuntos em geral possam ser implementados usando árvores, os conjuntos em Python podem ser implementados usando uma tabela hash. Isso permite um método altamente otimizado para verificar se um elemento específico está contido no conjunto

Criação de um conjunto

Um conjunto é criado colocando todos os itens (elementos) entre chaves {}, separados por vírgula ou usando a função integrada set(). Observe as seguintes linhas de código -

>>> #set of integers
>>> my_set = {1,2,4,8}
>>> print(my_set)
{8, 1, 2, 4}
>>>
>>> #set of mixed datatypes
>>> my_set = {1.0, "Hello World!", (2, 4, 6)}
>>> print(my_set)
{1.0, (2, 4, 6), 'Hello World!'}
>>>

Métodos para conjuntos

Observe o código a seguir para entender sobre métodos para conjuntos -

>>> >>> #METHODS FOR SETS
>>>
>>> #add(x) Method
>>> topics = {'Python', 'Java', 'C#'}
>>> topics.add('C++')
>>> topics
{'C#', 'C++', 'Java', 'Python'}
>>>
>>> #union(s) Method, returns a union of two set.
>>> topics
{'C#', 'C++', 'Java', 'Python'}
>>> team = {'Developer', 'Content Writer', 'Editor','Tester'}
>>> group = topics.union(team)
>>> group
{'Tester', 'C#', 'Python', 'Editor', 'Developer', 'C++', 'Java', 'Content
Writer'}
>>> # intersets(s) method, returns an intersection of two sets
>>> inters = topics.intersection(team)
>>> inters
set()
>>>
>>> # difference(s) Method, returns a set containing all the elements of
invoking set but not of the second set.
>>>
>>> safe = topics.difference(team)
>>> safe
{'Python', 'C++', 'Java', 'C#'}
>>>
>>> diff = topics.difference(group)
>>> diff
set()
>>> #clear() Method, Empties the whole set.
>>> group.clear()
>>> group
set()
>>>

Operadores para conjuntos

Observe o código a seguir para entender sobre operadores para conjuntos -

>>> # PYTHON SET OPERATIONS
>>>
>>> #Creating two sets
>>> set1 = set()
>>> set2 = set()
>>>
>>> # Adding elements to set
>>> for i in range(1,5):
   set1.add(i)
>>> for j in range(4,9):
   set2.add(j)
>>> set1
{1, 2, 3, 4}
>>> set2
{4, 5, 6, 7, 8}
>>>
>>> #Union of set1 and set2
>>> set3 = set1 | set2 # same as set1.union(set2)
>>> print('Union of set1 & set2: set3 = ', set3)
Union of set1 & set2: set3 = {1, 2, 3, 4, 5, 6, 7, 8}
>>>
>>> #Intersection of set1 & set2
>>> set4 = set1 & set2 # same as set1.intersection(set2)
>>> print('Intersection of set1 and set2: set4 = ', set4)
Intersection of set1 and set2: set4 = {4}
>>>
>>> # Checking relation between set3 and set4
>>> if set3 > set4: # set3.issuperset(set4)
   print('Set3 is superset of set4')
elif set3 < set4: #set3.issubset(set4)
   print('Set3 is subset of set4')
else: #set3 == set4
   print('Set 3 is same as set4')
Set3 is superset of set4
>>>
>>> # Difference between set3 and set4
>>> set5 = set3 - set4
>>> print('Elements in set3 and not in set4: set5 = ', set5)
Elements in set3 and not in set4: set5 = {1, 2, 3, 5, 6, 7, 8}
>>>
>>> # Check if set4 and set5 are disjoint sets
>>> if set4.isdisjoint(set5):
   print('Set4 and set5 have nothing in common\n')
Set4 and set5 have nothing in common
>>> # Removing all the values of set5
>>> set5.clear()
>>> set5 set()