Listas e Tuplas em Python

Listas

Apesar de aparentemente serem criadas e usadas como arrays, Python não possui esse tipo de estrutura, sendo a lista o mais próximo. Uma vantagem disso é que as listas têm tamanho variável, enquanto arrays não. Por outro lado, arrays são mais rápidos do que listas.

 Caso queira trabalhar com arrays, a biblioteca numpy oferece esse tipo de estrutura, assim como diversos métodos (bastante otimizados) para manipulação dos mesmos.

As listas podem conter elementos de qualquer tipo, mas isso é considerado uma má prática.

Para criar uma lista:

lista = [] # lista vazia
lista = [-10, 2, 14, 27] # lista populada


Podemos obter o elemento número n da lista (sendo n > 0 e n < len(lista): 

lista = [-10, 2, 14, 27]
lista[0] # -10
lista[2] # 14


Também é possível obter o elemento número n a partir do final da lista (sendo n > 1 e n <= len(lista)):

lista = [-10, 2, 14, 27]
lista[-1] # 27
lista[-4] # -10

Caso seja utilizado um index inválido (ou seja, fora do range da lista), o seguinte erro será lançado:

IndexError: list index out of range


Para obter a quantidade de elementos na lista:

len(lista)


Para alterarmos um valor da lista em uma posição específica:

lista[n] = novo_valor


Strings são consideradas listas de caracteres imutáveis. Portanto, podemos usar os métodos acima para iterar em uma string, mas não para modificá-la (caso tente modificá-la, obterá um erro TypeError)


Podemos concatenar duas listas:

lista1 = [1, 2]
lista2 = [3, 4]
lista_concatenada = lista1 + lista2 # [1, 2, 3, 4]


Para adicionarmos elementos dinamicamente em uma lista, basta concatená-la com uma “lista do valor a ser adicionado”:

lista = []
for number in range(1, 11): # de 1 à 10
lista = lista + [number]  # ou lista += [number]
print(lista) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

No exemplo acima, para que o += seja usado em uma lista, é preciso que o valor a ser adicionado seja algum tipo de sequência (lista, tuple, string)

Por exemplo:

letters = []
letters += ‘String’
print(letters) # ['S', 't', 'r', 'i', 'n', 'g']


Podemos verificar se uma lista é um subconjunto de outra lista usando comparadores.

Exemplo:

lista1 = [1, 2]
lista2 = [1, 2]
lista3 = [1, 2, 3]
lista1 == lista2 # True - Contém os mesmos valores
lista1 == lista3 # False
lista1 < lista3 # True - É um subconjunto
lista3 >= lista2 # True - Possui os valores de lista2 e alguns a mais


Tuplas

Para criar uma tuple:

alunos = () # vazia
alunos = (‘Lucas’, ‘Ana’) # tuple populada usando parênteses
alunos = ‘Lucas’, ‘Ana’ #tuple populada sem usar parênteses


Assim como as listas, tuples são imutáveis. Logo, podemos pegar o valor em uma posição específica, mas não podemos alterar o valor daquela posição:

Exemplo

letras = (‘a’, ‘b’)
letras[0] # Válido, retorna ‘a’
letras[0] = ‘c’ # Lança TypeError: 'tuple' object does not support item assignment


Para criar uma tuple com apenas um elemento, pode parecer que a sintaxe seria tuple = (valor), mas isso não funcionaria. Isso porque o que define uma tuple não são os parênteses, e sim as vírgulas. Portanto, a sintaxe correta seria:

tuple = valor, 


Quando criamos uma variável atribuindo uma outra variável que representa uma tuple, então ambas irão representar a mesma tuple. Isso também vale para listas.


 Podemos guardar cada elemento de uma tuple em uma variável diferente da seguinte forma:

nomes = ‘Lucas’, ‘Luna’
nome1, nome1 = nomes

 Caso a quantidade de variáveis que irão receber os valores da tuple seja menor do que a quantidade de elementos, o seguinte erro será lançado:

ValueError: too many values to unpack 

Caso a quantidade de variáveis seja maior, será o seguinte erro:

ValueError: not enough values to unpack


A função enumerate(lista) cria uma tuple para cada elemento da lista contendo o index do elemento e o elemento em si.

lista1 = [‘a’, ‘b’, ‘c’]
lista2 = list(enumerate(lista2))
print(lista2) # [(0, ‘a’), (1, ‘b’), (2, ‘c’)]


Sempre que você multiplica uma sequência por um número inteiro, aquela sequência é replicada N vezes.

Exemplo:

lista = [1, 2, 3]
lista2 = lista * 3
print(lista2) # [1, 2, 3, 1, 2, 3, 1, 2, 3]

Exemplo 2:

print(‘*’ * 10)  # irá exibir ‘**********’


Slice


Fazer o slice de uma sequência significa pegar um subconjunto da mesma. Para isso, basta passar entre chaves o índice de início do subconjunto e o de fim (que não é incluído).

Exemplo:

lista = [‘a’, ‘b’, ‘c’, ‘d’]
lista[1: 3] # retorna [‘b’, ‘c’]


Para obter os elementos até determinado índice (ou seja, começando do zero), passamos somente o índice de fim:

lista = [‘a’, ‘b’, ‘c’, ‘d’]
lista[:2] # retorna [‘a’, ‘b’]


Para pegar os elementos a partir de um determinado índice, basta passar o índice de início:

lista = [‘a’, ‘b’, ‘c’, ‘d’]
lista[2:] # retorna [‘a’, ‘b’’]

Podemos passar um step para a função slice para pegar a cada N elementos.

Exemplo:

lista = [‘a’, ‘b’, ‘c’, ‘d’]
lista[::2] # irá exibir ‘a’, ‘c’
lista[::3] # irá exibir ‘a’, ‘d
lista[1::2] # irá exibir ‘b’, ‘d’
lista[::-1] # irá exibir ‘d’, ‘c’, ‘b’, ‘a’


Pode-se utilizar o slice para substituir vários elementos de uma vez:

lista = [‘a’, ‘b’, ‘c’, ‘d’]
lista[0:2] = [‘A’, ‘B’]
lista # [‘A’, ‘B’, ‘c’, ‘d’]


E também para remover os elementos:

lista = [‘a’, ‘b’, ‘c’, ‘d’]
lista[0:2] = []
lista # [‘c’, ‘d’]
lista[:] = [] # remove todos os elementos da lista

Para remoção de elementos também existe a função del:

lista = [1, 2, 3, 4]
del lista[0] # fica [2, 3, 4]
del lista[1:] # fica [2]

Ordenação

Podemos ordenar uma lista usando o método sort. Caso a lista contenha números, esse método irá ordenar os números em ordem crescente.

Exemplo:

lista = [4, 2, 3, 1]
lista.sort() # [1, 2, 3, 4]


Para ordenar por ordem decrescente, basta definir o argumento reverse=True:

lista = [4, 2, 3, 1]
lista.sort(reverse=True) # [4, 3, 2, 1]


Caso seja necessário criar uma cópia ordenada de uma lista sem alterar a original, pode-se utilizar a função sorted(lista):

Exemplo:

lista = [4, 2, 3, 1]
lista_ordenada = sorted(lista)


Podemos usar a função sorted para sequências imutáveis também (como strings e tuplas).


Cópia


Podemos fazer uma cópia de uma lista não especificando nenhum dos dois índices:

lista = [‘a’, ‘b’, ‘c’, ‘d’]
lista_copia = lista[:]


É importante ressaltar que é feita uma cópia das referências da lista. Portanto, se na lista existir um objetos, as duas listas irão apontar para o mesmo objeto. Caso não queria que a sequência seja modificada, pode-se passar uma tupla ao invés de uma lista, visto que ela não é alterável


Comentários

Postagens mais visitadas deste blog

Como criar um jogo usando Python

Biblioteca Python: Random