Python #2 : estrutura de dados - listas
Tags: beginners, datascience, python, codenewbie
Published: 2022-01-22 04:26:55

_Esse post faz parte dos meus cadernos **pessoais** de estudos. Todas as anotações são baseadas nas aulas da Mentorama - Cientista de Dados do zero e organizadas sob o meu ponto de vista. M2A3._

---

### Estrutura de Dados em Python 

Definição: Coleções de dados com características específicas


#### Listas

Mutáveis, vários tipos.
Existe um espaço na memória para cada valor da lista.

---

#####Criar lista: 
 Usamos `[ ] ` e separamos os valores por `,`

`lista_nomes = ['Annie', 'Elias', 'Sarah', 'San'] 
type(lista_nomes)
 list`

Essa lista era de nomes, então tinham só variáveis no formato `string`. Agora vamos criar uma com vários tipos de variáveis.

`lista_varios_tipos = [1,2, True, [3,4,5]]`
veja que em `[3,4,5]` foi colocada uma lista dentro da lista.

se você pedir o tipo 
`type(lista_varios_tipos)` 
vai retornar `list` também. 

Dá pra retornar uma lista vazia também, só deixando os colchetes vazios `[ ]`

- 
Para visualizar os elementos da lista: <u>print</u>
`print(lista_nomes)`

- 
Para contar o número de elementos numa lista: <u>len</u>
`print(len(listanomes))`

- Para acessar os elementos da lista:

A indexação no python começa em zero. Então o 1° elemento estará sempre na posição 0. O 2° elemento será o 1. 

No exemplo da `lista_varios_tipos = [1,2, True, [3,4,5]]`
a indexação será:
0 = `1`
1 = `2 `
2 = `True `
3 = `[3,4,5] `(aqui ele retorna a lista inteira que está inserida]


Se você quiser saber algum elemento da lista que é outro elemento, tem que botar as indexações em ordem assim:

`lista_varios_tipos[3][1]`

ou seja: o index `[3]` é a lista `[3,4,5]`, e o `[1]` é o segundo elemento de dentro dessa lista `4`

- para "fatiar" uma lista, ou seja, acessar apenas uma parte dela. função chamada _slicing_

na `lista_nomes = [Annie, Elias, Sarah, San] `

se eu pedir um _slicing_, ele será sempre ABERTO a direita e FECHADO a esquerda, o último elemento do index não vai aparecer. 

`lista_nomes = [0:2]`
vai retornar
`Annie, Elias `
que pode ser simplificado por `lista_nomes = [:2]`
seria tipo um "até dois". 

também é possível consultar "de trás para frente" usando uma posição negativa 

`lista_nomes = [-1]`

vai retornar `San` que é o último elemento da lista
`lista_nomes = [-2]`retorna `Sarah` que é o penúltimo

---


#####Strings VS. Listas 

Dentro de uma lista, um elemento `string` também é visto como uma sequência de caracteres. 

Assim como fizemos em `lista_varios_tipos[3][1]` que retornou o segundo elemento de lista [3], conseguimos fazer com uma variável string. 

Em `lista_nomes[0]` retorna `"Annie"`
Se eu colocar `lista_nomes[0][3]`
ele vai me retornar o 4º elemento da string `"Annie"`ou seja 
`lista_nomes[0][3]
"i"`

##### Alterar valores em lista 
 
Vamos supor que a 'Annie' agora quer usar seu segundo nome, 'Carol'

`lista_nomes[0] = Carol`
 
quando eu rodar `lista_nomes` ele vai retornar
`'Carol', 'Elias', 'Sarah', 'San'`

- mas a String é imutável 

eu jamais conseguiria trocar "Carol" por "Karol" alterando seu primeiro elemento 

`lista_nomes[0][0] = K`
**NÃO FUNCIONA**

---

##### Concatenar listas 

Para juntar duas listas é a mesma coisa pra concatenar strings: usar o operador de soma. 
Exemplo:
`lista_todos = lista1 + lista 2 `

---

##### FUNÇÕES PARA A LISTA

Exemplo:

lista_de_notas = [6, 7, 8, 5, 4, 9, 10, 2, 4] 

- menor elemento da lista 
`min(lista_de_notas)
2`
- maior 
`max(lista_de_notas) 
10`

- soma 
`sum(lista_de_notas)
55`

como eu ainda não instalei nenhum módulo statistics vou calcular a média manualmente calculando o número de elementos também

`len(lista_de_notas)
9`

`print(55/9)
6.1`

agora vou tentar tirar a mediana, usando o sort e depois tirar a média usando o acesso ao elemento 

`lista_de_notas.sort()` essa função coloca a lista em ordem crescente (achei no stackoverflow)

rodei, e pedi o print

`print(lista_de_notas)
[2, 4, 4, 5, 6, 7, 8, 9, 10]`

a mediana é a do meio, já vi que é a nota `6` mas quero fazer do jeito certo

na aula de estatística aprendi que a mediana de uma observação com n ímpar é o número da posição do meio

quantos números eu tenho (n)? já vi no len!

`len(lista_de_notas)
9`

qual o número da posição do meio? n+1/2 = 9 + 1 = 10/2 = 5 
como vou puxar ela na lista? 

`lista_de_notas[4]
6`

---

##### A função range 

Faz uma lista de maneira automática 

`lista_range = list(range(0,10,1))`

criar `list `
num intervalo `range `
de `0` a `10 `
com passos de `1` a 

retornou 
`[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
`
então entendi de novo que o intervalo vai ser fechado à direita 
se eu quisesse até o `10`, ia pedir o` 11`


`lista_range = list(range(0,11,1))
print(lista_range)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]`

---

#### FUNÇÕES NATIVAS PARA LISTAS

##### Adicionar elementos em uma lista 
Além de concatenar duas listas, também podemos adicionar elementos a uma lista usando o operador ` +` 

`linguagens = ["Python", "SQL", "R"]
print(linguagens)
'Python', 'SQL', 'R'`

agora vou adicionar mais elementos 

`linguagens_2 = linguagens + ["Java", "C++"]
print(linguagens_2)
['Python', 'SQL', 'R', 'Java', 'C++']`


- 
também dá pra adicionar usando a função `append` que é própria para listas 

`linguagens.append("Java")
linguagens.append("C++")
print(linguagens)
['Python', 'SQL', 'R', 'Java', 'C++']`

se eu passar o `append `como lista, ele vai inserir uma lista dentro da lista, e não acrescentar os elementos normalmente 
`
linguagens.append(["Java", "C++"])
print(linguagens)
['Python', 'SQL', 'R', ['Java', 'C++']]`

para adicionar vários elementos de uma vez em lista mas para adicionar como elementos soltos na lista original, usa-se o `extend`

`linguagens.extend(["Java", "C++"])
print(linguagens)
['Python', 'SQL', 'R', ['Java', 'C++'], 'Java', 'C++']`

_nesse caso aqui acrescentei sem criar outra lista ou renomear(?)_

o `insert` adiciona um elemento `"Scala"`, mas em uma opção específica `0`

`linguagens.insert(0,"Scala")
print(linguagens)
['Scala','Python', 'SQL', 'R', ['Java', 'C++'], 'Java', 'C++', 'Java', 'C++']`

##### Remover elementos 

o `remove` deleta o primeiro elemento que aparecer com aquele nome 

`linguagens.remove("C++")
print(linguagens)
['Scala','Python', 'SQL', 'R', ['Java', 'C++'], 'Java']`

percebi que ele deletou o `"C++"` que estava fora da lista embutida

o `pop` remove um elemento de acordo com o index, não pelo nome

`linguagens.pop(0)
print(linguagens)
['Python', 'SQL', 'R', ['Java', 'C++'], 'Java']`

retornou sem o `'Scala'` que botamos no `insert`

##### Contar elementos

a função `count` conta quantos elementos você tem com aquele nome 

`linguagens.count("Java")
1`

de novo, ele não contou o que estava na lista embutida


#### Limpar uma lista 

`linguagens_2.clear
print(linguagens_2)
[ ]`