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 = [-10, 2, 14, 27] # lista populada
Podemos obter o elemento número n da lista (sendo n > 0 e n < len(lista):
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[-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:
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”:
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 += ‘String’
print(letters) # ['S', 't', 'r', 'i', 'n', 'g']
Podemos verificar se uma lista é um subconjunto de outra lista usando comparadores.
Exemplo:
lista2 = [1, 2]
lista3 = [1, 2, 3]
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 = (‘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[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:
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:
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:
Caso a quantidade de variáveis seja maior, será o seguinte erro:
A função enumerate(lista) cria uma tuple para cada elemento da lista contendo o index do elemento e o elemento em si.
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:
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[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[:2] # retorna [‘a’, ‘b’]
Para pegar os elementos a partir de um determinado índice, basta passar o índice de início:
lista[2:] # retorna [‘a’, ‘b’’]
Podemos passar um step para a função slice para pegar a cada N elementos.
Exemplo:
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[0:2] = [‘A’, ‘B’]
lista # [‘A’, ‘B’, ‘c’, ‘d’]
E também para remover os elementos:
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:
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.sort() # [1, 2, 3, 4]
Para ordenar por ordem decrescente, basta definir o argumento reverse=True:
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_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_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
Postar um comentário