Dando sequência aos contêineres em Python, este tópico é sobre listas.
Listas são estruturas de armazenamento de dados parecidas com as tuplas, mas que têm mais métodos e propriedades associados. Armazenam dados dentro de colchetes.
Ao contrário das tuplas, listas são mutáveis, e só essa característica explica muito dos métodos das listas.
Podemos criar listas de duas formas principais:
In [1]: lista = []
In [2]: lista = list()
E assim como tuplas, elas armazenam qualquer tipo de dado:
In [6]: lista = [1, 2, 3, [1, 2, 3], (1, 2, 3), {'one': 1, 'two': 2}, 'ABEV3', lambda x: x + 2, range(10)]
In [7]: lista
Out[7]:
[1,
2,
3,
[1, 2, 3],
(1, 2, 3),
{'one': 1, 'two': 2},
'ABEV3',
<function __main__.<lambda>(x)>,
range(0, 10)]
In [8]: for item in lista:
...: print(type(item))
...:
<class 'int'>
<class 'int'>
<class 'int'>
<class 'list'>
<class 'tuple'>
<class 'dict'>
<class 'str'>
<class 'function'>
<class 'range'>
Por serem mutáveis, podemos alterar os itens dentro delas mantendo a identidade da lista na memória do computador:
In [9]: lista = [1, 2, 3, 4, 5]
In [10]: id(lista) # id() é uma função que retorna um número que corresponde à identidade daquele elemento na memória do computador
Out[10]: 139981181929864
In [11]: lista[3] = lista[3] * 2
In [12]: lista
Out[12]: [1, 2, 3, 8, 5]
In [13]: id(lista)
Out[13]: 139981181929864 # Percebam que eu não alterei a identidade da lista mudando um item dela, é a mesma lista de antes
Listas apresentam diversos métodos úteis:
In [14]: lista = [1, 2, 3, 4, 5]
In [15]: lista.append(6) # Adiciona um elemento à última posição da lista
In [16]: lista
Out[16]: [1, 2, 3, 4, 5, 6]
In [17]: lista.extend([7, 8, 9, 10]) # Extende a lista a partir da última posição com um iterável passado como argumento
In [18]: lista
Out[18]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
In [19]: lista.insert(2, 2) # Insere um elemento no índice selecionado. O primeiro argumento é o índice e o segundo argumento é o elemento a ser adicionado
In [20]: lista.insert(6, 10) # Adiciona mais um "10" ao índice 6
In [21]: lista
Out[21]: [1, 2, 2, 3, 4, 5, 10, 6, 7, 8, 9, 10]
In [22]: lista.count(10) # Conta quantas vezes o elemento passado como argumento aparece na lista
Out[22]: 2
In [23]: lista.pop() # Retira e retorna um elemento da lista. Pode receber como argumento o índice a ser retirado o elemento. Se nenhum índice for passado, retira o último elemento.
Out[23]: 10
In [24]: lista.pop(4) # Retira e retorna o elemento do índice 4.
Out[24]: 4
In [25]: lista.reverse() # Reverte a ordem da lista.
In [26]: lista
Out[26]: [9, 8, 7, 6, 10, 5, 3, 2, 2, 1]
In [27]: lista.sort() # Ordena a lista novamente.
In [28]: lista
Out[28]: [1, 2, 2, 3, 5, 6, 7, 8, 9, 10]
In [29]: lista2 = lista.copy() # Cria uma cópia rasa da lista
In [30]: lista2
Out[30]: [1, 2, 2, 3, 5, 6, 7, 8, 9, 10]
In [31]: lista2 is lista # Aqui vemos que as duas listas são diferentes apesar de apresentarem os mesmos valores.
Out[31]: False
In [32]: print(id(lista), id(lista2))
139981225678152 139981198891784 # Valores diferentes para id
In [33]: lista.remove(2) # Remove a primeira ocorrência do número 2 na lista. Aqui o argumento é o elemento em si e não o índice.
In [34]: lista
Out[34]: [1, 2, 3, 5, 6, 7, 8, 9, 10]
In [35]: lista.clear() # Limpa toda a lista
In [36]: lista
Out[36]: []
Importante também saber diferenciar a igualdade entre listas no tocante aos itens da lista e às suas identidades:
In [37]: lista = [1, 2, 3, 4, 5]
In [38]: lista_2 = [1, 2, 3, 4, 5]
In [39]: lista is lista_2 # São duas listas diferentes que armazenam os mesmos valores
Out[39]: False
In [40]: lista == lista_2 # Os valores dentro da lista são iguais
Out[40]: True
Um assunto interessantíssimo sobre listas são as list comprehensions mas esse assunto vai ficar pro próximo tópico.