Como usar List Comprehension em Python – alterando cores no scatterplot

Olá pessoas, nesse post vamos brincar com a List Comprehension em Python que é uma maneira muito útil de diminuir o tamanho do código, torná-lo mais simples e aplicar os conceitos de lista e de looping.

List Comprehension em Python

Inicialmente, a List Comprehension em Python é de extrema utilidade e sua incorporação no código trás muitos benefícios. Mas antes é preciso pontuar a importância das listas que são estruturas indexadas e que atendem as necessidades tanto para dados numéricos como alfanuméricos. Listas são uma das estruturas mais importantes e mais aplicadas em Python e estão sempre presentes na otimização da codificação.

Os seguintes métodos estão disponíveis em uma lista:

  • list.append(x): Adiciona um item ao fim da lista.
  • list.extend(iterable): Adiciona todos os itens do iterável iterable ao fim da lista.
  • list.insert(i, x): Insere um item em uma dada posição i.
  • list.remove(x): Remove o primeiro elemento, cujo valor seja x.
  • list.pop(i): Remove o item de posição i da lista e o retorna. Caso i não seja especificado, retorna o último elemento da lista.
  • list.clear(): Remove todos os elementos da lista.
  • list.index(x[, start[, end]]): Retorna o índice do primeiro elemento cujo valor seja x.
  • list.count(x): Retorna o número de vezes que o valor x aparece na lista.
  • list.sort(key=None, reverse=False): Ordena os items da lista (os argumentos podem ser usados para customizar a ordenação).
  • list.reverse(): Reverte os elementos da lista.
  • list.copy(): Retorna uma lista com a cópia dos elementos da lista de origem.

List Comprehension: definição

As List Comprehensions são listas que são criadas de forma mais inteligente para serem aplicadas de forma mais rápida e direta, economizando linhas de programação.

A sintaxe de uma List Comprehension, normalmente, obedece a seguinte estrutura:

nova_lista = [expressão looping condição]

expressão = variável ou expressão
looping = 
condição

new_l = [x**2 for x in range(10) if (x%2)]

O resultado é uma lista contendo os números ímpares 1, 3, 5, 7 e 9 elevados ao quadrado, ou seja, 
new_l = [1, 9, 25, 49, 81]

Ok, não é muito complicado, né? Então vamos complicar um pouco mais. Vamos fazer a brincadeira do Pim, não conheces? É o seguinte: vamos “falar” números em ordem crescente e cada vez que um número divisível por 3, falamos Pim, quer errar perde ou está fora se tivermos mais de duas pessoas. Exemplo: Pim, 1, 2, Pim, 4, 5, Pim. No problem!

Como fica isso codificando com Python:

new_l = [t if (t/3%1) else "Pim" for t in range(20)]
print(new_l)

Saída:
['Pim', 1, 2, 'Pim', 4, 5, 'Pim', 7, 8, 'Pim', 10, 11, 'Pim', 13, 14, 'Pim', 16, 17, 'Pim', 19]

A saída é o resultado do código. Note que a brincadeira começa com Pim , mas é só para ilustrar.

Coloquei até 20, mas coloque o número que quiseres, vai lá e testa.

Bom, agora vamos usar todos esses “poderes” a nosso favor. Digamos que eu tenha duas variáveis e quero fazer um scatter plot delas, ou seja, x contra y.

O código abaixo mostra como fazer o scatter plot de duas variáveis x e f(x) usando números aleatórios e fixando uma condição inicial para isso garantindo que o resultado seja sempre o mesmo para os números gerados aleatoriamente. A Figura 1 ilustra o resultado do código.

# Bibliotecas
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
# Para gerar os números de forma aleatória e fixar uma seed
from numpy.random import seed
from numpy.random import randint

# Gerando as nossas variáveis
rng = np.random.default_rng(1020)
x = randint(1, 100, 50)
y = x**1/2 + rng.normal(2 * (x / np.max(x)))

# Inicializando o layout do gráfico
fig, ax = plt.subplots(figsize = (9, 6))

# Plotando o scatter plot
ax.scatter(x, y, s=60, alpha=0.7, edgecolors="w")
plt.title('Scatter plot', size = 20)
plt.xlabel('Eixo - X')
plt.ylabel('Eixo - Y')
Figura 1: Gráfico mostrando a relação entre duas variáveis

Aumentando a dificuldade com List Comprehension

Agora, digamos que quero segmentar os pontos do gráfico. Vamos assumir que os valores de x que estão abaixo de 50 representam uma condição e que os acima, representam outra. Como fazer isso no Python?
Programar é criação, ou seja, saber usar os recursos que se tem de forma a atingir um objetivo. O nosso é segmentar os em duas categorias e queremos fazer isso com List Comprehension em Python. Então aí vai…vamos fazer apenas uma pequena modificação no código anterior. Usaremos o atributo cor na função scatter(). Adicionaremos uma list que representará as cores dos pontos. Ficará assim:

c_cor = ['red' if i > 50 else 'blue' for i in x]

ax.scatter(x, y, s=60, c=c_cor, alpha=0.7, edgecolors="w");

O scatter plot fica como na Figura 2. Podemos diferenciar os dois grupos que foram discretizados. Se analisarmos a lista que contem os códigos de cor, c_cor, veremos que é uma lista com valores red e blue , que representam a cor de cada par ordenado xy.

Figura 2: Gráfico ilustrando a segmentação dos dados usando List Comprehention.

Aproveitando o mesmo exemplo, podemos agora aplicar mais de uma condição, por exemplo, vermelho entre 30 e 60 e os demais na cor azul. O código ficaria como abaixo. A Figura 3 ilustra a modificação no código.

c_cor = ['red' if i > 30 and i < 60 else 'blue' for i in x]

ax.scatter(x, y, s=60, c=c_cor, alpha=0.7, edgecolors="w");
Figura 3: Segmentação usando List Comprehension.

Conclusão

Esta é só uma degustação do poder da List Comprehension em Python. É uma ferramenta muito útil em qualquer nível de programação que o pythonista esteja. Modifique o código a teu gosto e busque outras variantes para mudar a cor dos pontos. Até o próximo post e não esqueça de seguir-me no Instagram, Twitter, LinkedIn, etc


Encontre aqui vagas e bolsas para Mestrado e Doutorado

Fundamentalmente, para você ter um direcionamento na sua Carreira Acadêmica é primordial saber e conhecer as oportunidades desse futuro que te espera. Sendo assim, preparei para você algumas oportunidades para ter acompanhamento, tanto para mestrado como para doutorado.

– Vagas e bolsas para Mestrado março de 2023

– Vagas e bolsas para Doutorado março de 2023


    Leave A Comment