<jupyter_start><jupyter_text>ListasAnteriormente, ao discutir strings, introduzimos o conceito de *sequência* em Python. As listas podem ser pensadas na versão mais geral de uma *sequência* em Python. Ao contrário das strings, eles são mutáveis, o que significa que os elementos dentro de uma lista podem ser alterados!Nesta seção, aprenderemos sobre:         1) Criação de listas     2) Índice e corte de listas     3) Métodos de listas     4) Listas aninhadas     5) Introdução ao método de Compreensão em listasAs listas são construídas com colchetes [] e vírgulas que separam cada elemento da lista.Avançemos e vejamos como podemos construir listas!<jupyter_code># Atribui uma lista a uma variável chamada minha_lista
minha_lista = [1,2,3]<jupyter_output><empty_output><jupyter_text>Acabamos de criar uma lista de números inteiros, mas as listas podem realmente armazenar diferentes tipos de objeto. Por exemplo:<jupyter_code>minha_lista_2 = ['Uma string',23,100.232,'o']<jupyter_output><empty_output><jupyter_text>Assim como as strings, a função len() irá dizer-lhe quantos itens estão na sequência da lista.<jupyter_code>len(minha_lista_2)<jupyter_output><empty_output><jupyter_text>Podemos também verificar qual o tipo da variável minha_lista_2**Obs.**: podemos observar que surgiu um novo tipo de dado<jupyter_code>type(minha_lista_2)<jupyter_output><empty_output><jupyter_text>Indexação e corteIndexar e cortar funciona exatamente como em strings. Vamos fazer uma nova lista para nos lembrar de como isso funciona:<jupyter_code>minha_lista_3 = ['um','dois','três',4,5]
# Pega o elemento de indice 0
minha_lista_3[0]
# Pegue o índice 1 e tudo depois
minha_lista_3[1:3]
# Pega tudo até o elemento de índice 3
minha_lista_3[1:-1]<jupyter_output><empty_output><jupyter_text>Nós também podemos usar + para concatenar listas, assim como fizemos por strings.<jupyter_code>minha_lista_3 + ['novo item']<jupyter_output><empty_output><jupyter_text>**Observação**: Isso realmente não altera a lista original!<jupyter_code>minha_lista_3<jupyter_output><empty_output><jupyter_text>Você teria que reatribuir a lista para tornar a mudança permanente.<jupyter_code># Reassign
minha_lista_3 = minha_lista_3 + ['adicionando um novo elemento permanentemente']
minha_lista_3<jupyter_output><empty_output><jupyter_text>Nós também podemos usar o * para um método de duplicação semelhante às strings:<jupyter_code># Duplicando os elementos da lista
minha_lista_3 * 2<jupyter_output><empty_output><jupyter_text>**Obs.:** mais uma ez esta operação não altera permanetemente a lista original<jupyter_code>minha_lista_3 = minha_lista_3*2
len(minha_lista_3)<jupyter_output><empty_output><jupyter_text>Também deve notar-se que a indexação das listas retornará um erro se não houver nenhum elemento nesse índice. Por exemplo:<jupyter_code>minha_lista_3[11]<jupyter_output><empty_output><jupyter_text>Métodos de ListasOs métodos de listas são muito úteis na programação. Vamos explorar um pouco mais sobre eles adiante  append( ) Use o método **append( )** para adicionar permanentemente um item ao final de uma lista:<jupyter_code># Criando uma lista
l =  [1,2,3,4]
l.append(5)
l
# Utilizando o método append(),passando como parâmentro o novo elemento da lista
l.append('adicionando um elemento!')
# Mostrar a lista 
l
l.append(2)
l<jupyter_output><empty_output><jupyter_text>count( )count( ) retorna o número de vezes que um elemento aparece na lista<jupyter_code>l.count(10)
l.count(2)<jupyter_output><empty_output><jupyter_text>extend( )Muitas vezes as pessoas acham a diferença entre extend e append que não está claro. Então note:**append: anexa objeto no final**<jupyter_code>x = [1, 2, 3]
x.append([4, 5])
print(x)<jupyter_output>[1, 2, 3, [4, 5]]<jupyter_text>**extend**: amplia a lista anexando elementos do iterável<jupyter_code>x = [1, 2, 3]
x.extend([4, 5])
print(x)<jupyter_output>[1, 2, 3, 4, 5]<jupyter_text>Observe como extend acrescenta cada elemento nesse iterável. Essa é a principal diferença.  index( )Index retornará o índice de qualquer elemento que seja colocado como um argumento. Nota: Se o elemento não estiver na lista, um erro será retornado.<jupyter_code>l
l.index(2)
l.index(12)<jupyter_output><empty_output><jupyter_text>insert( )insert pega dois argumentos: insert(índice, objeto) Este método coloca o objeto no índice fornecido. Por exemplo:<jupyter_code>l
# Coloca uma letra no índice 2
l.insert(2,'inserindo')
l<jupyter_output><empty_output><jupyter_text>pop( )Para retirar um elemento da lista utilizamos o parâmetro **pop( )** . Por padrão, pop tira o último índice, mas também pode especificar qual índice aparecer. Vamos ver um exemplo:<jupyter_code>a = l
a 
a = a.pop()
a
b = l.pop(2)
b<jupyter_output><empty_output><jupyter_text>remove( )O método **remove( )** remove a primeira ocorrência de um valor. Por exemplo:<jupyter_code>l
l.remove(4)
l.append(3)
l
l.remove(3)
l<jupyter_output><empty_output><jupyter_text>reverse( )Método utilizado para inverter uma lista<jupyter_code>nova_lista = ['a','e','x','b','c']
nova_lista
# Usando o método reverse() para reverter a ordem da lista - este método altera a lista permanentemente!
nova_lista.reverse()
nova_lista
nova_lista = ['a','e','x','b','c']
lista_nova = []
for i in range(len(nova_lista)):
    
    print(-(i+1))
    lista_nova.append(nova_lista[-(i+1)])
    
lista_nova<jupyter_output><empty_output><jupyter_text>sort( )Método utilizado para ordenar uma lista<jupyter_code># Usando o método sort() para ordenar a lista (neste caso, ordem alfabética) - este método altera a lista permanentemente!
nova_lista.sort()
nova_lista<jupyter_output><empty_output><jupyter_text>Listas aninhadasUma ótima característica das estruturas de dados do Python é que eles suportam * aninhamento *. Isso significa que podemos ter estruturas de dados dentro das estruturas de dados. Por exemplo: uma lista dentro de uma lista.Vamos ver como isso funciona!<jupyter_code># Começamos com 3 listas
lista_1=[1,2,3]
lista_2=[4,5,6]
lista_3=[7,8,9]

# Faça uma lista de listas para formar uma matriz
matrix = [lista_1,lista_2,lista_3]
# Mostra
matrix<jupyter_output><empty_output><jupyter_text>Agora, podemos usar novamente a indexação para pegar elementos, mas agora existem dois níveis para o índice. Os itens no objeto matriz e, em seguida, os itens dentro dessa lista!<jupyter_code># Pegue o primeiro item no objeto da matriz
matrix[0]
# Pegue o primeiro item do primeiro item no objeto da matriz
matrix[0][0]<jupyter_output><empty_output><jupyter_text>Compreensão em listasAlém das operações de sequência e métodos de lista, o Python inclui uma operação mais avançada chamada de compreensão de lista.As compreensões de lista nos permitem construir listas usando uma notação diferente. Você pode pensar nisso essencialmente como um loop construído dentro de colchetes. Um exemplo simples: Exemplo 1<jupyter_code>lista = []
for i in 'word':
    lista.append(i)
lista
# Pega todas as letras em uma string
lst = [i for i in 'passado']
lst<jupyter_output><empty_output><jupyter_text>Esta é a idéia básica de uma lista de compreensão.Vejamos mais alguns exemplos de compreensões de lista em Python: Exemplo 2<jupyter_code># Eleva o quadrado itens no range e o transformam em lista
lst = [x**2 for x in range(0,11)]
lst<jupyter_output><empty_output><jupyter_text>Exemplo 3Vamos ver como adicionar usando if:<jupyter_code># Cria uma lista de números pares, utilizando para isso o if
lst = [x for x in range(11) if x % 2 == 0]
lst<jupyter_output><empty_output><jupyter_text>Exemplo 4Também pode fazer operações aritméticas mais complicadas:<jupyter_code># Converte Celsius para Fahrenheit
celsius = [0,10,20.1,34.5]

fahrenheit = [ ((float(9)/5)*temp + 32) for temp in celsius]

fahrenheit<jupyter_output><empty_output><jupyter_text>Exemplo 5Também podemos realizar compreensões de lista aninhadas, por exemplo:<jupyter_code>lst = [ x**2 for x in [x**2 for x in range(11)]]
lst<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.09002891990443858, 'fraction_numerical': 0.01722620394819565, 'mean_word_length': 6.611483253588517, 'pattern_counts': {'":': 0, '<': 111, '<?xml version=': 0, '>': 111, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '28', 'dir': 'jupyter-structured-clean-dedup', 'id': '227559', 'license': 'MIT', 'n_tokens_mistral': 3056, 'n_tokens_neox': 3024, 'n_words': 876, 'path': '6 - Listas.ipynb', 'repo_name': 'andersoncordeiro/Learn-Python', 'size': '7953'}