sábado, 5 de dezembro de 2020

Compreensão e segmentação de listas em Python

A compreensão de listas é uma maneira elegante de definir e criar uma lista em python. Podemos criar listas apenas como declarações matemáticas e em apenas uma linha. A sintaxe de compreensão de lista é mais fácil de entender.

A compreensão de uma lista geralmente consiste nestas partes:

  1. Expressão de saída,
  2. Sequência de entrada,
  3. Uma variável que representa um membro da sequência de entrada e
  4. Uma parte opcional do predicado.
Por exemplo:

lst  =  [x ** 2  for x in range (1, 11)   if  x % 2 == 1] 

aqui, x ** 2 é a expressão de saída, 
      range (1, 11)  é a seguencia de entrada, 
      x é variável e  
      if x % 2 == 1 é a parte do predicado.

Exemplo 1:

# Programa Python para demonstrar compreensão de listas em Python

# a lista abaixo contém o quadrado de todos os números ímpares de 1 a 10 
odd_square = [x ** 2 for x in range(1, 11) if x % 2 == 1]
print (odd_square)

# para compreensão, a geração acima é igual a, 
odd_square = []
for x in range(1, 11):
    if x % 2 == 1:
        odd_square.append(x**2)
print (odd_square)

# a lista abaixo contém potência de 2 de 1 a 8
power_of_2 = [2 ** x for x in range(1, 9)]
print (power_of_2)

# a lista abaixo contém primos e não primos no intervalo de 1 a 50
noprimes = [j for i in range(2, 8) for j in range(i*2, 50, i)]
primes = [x for x in range(2, 50) if x not in noprimes]
print(primes)

# lista para diminuir os personagens
print ([x.lower() for x in ["A","B","C"]])

# lista que extrai o número
string = "Meu número de telefone é: 11122 !!"

print("\nDigitos extraidos")
numbers = [x for x in string if x.isdigit()]
print(numbers)

# Uma lista de lista para tabuada
a = 5
table = [[a, b, a * b] for b in range(1, 11)]

print("\nTabela de multiplicação")
for i in table:
    print(i) 

Resultado:

[1, 9, 25, 49, 81]
[1, 9, 25, 49, 81]
[2, 4, 8, 16, 32, 64, 128, 256]
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
['a', 'b', 'c']

Digitos extraidos
['1', '1', '1', '2', '2']

Tabela de multiplicação
[5, 1, 5]
[5, 2, 10]
[5, 3, 15]
[5, 4, 20]
[5, 5, 25]
[5, 6, 30]
[5, 7, 35]
[5, 8, 40]
[5, 9, 45]
[5, 10, 50]

Depois de obter a lista, podemos obter uma parte dela usando o operador de fatiamento do Python, que tem a seguinte sintaxe:

[inicio: fim: paso]

o que significa que o corte começará do início do índice
e vai até o fim de acordo com o paso.
O valor padrão de início é 0, a parada é o último índice da lista e o paso é 1

Assim, [:fim] dividirá a lista do início ao fim do índice e [inicio:] dividirá a lista do índice inicial até o final. O valor negativo das etapas mostra o percurso da direita para a esquerda em vez de o percurso da esquerda para a direita. É por isso que [::-1] imprime a lista na ordem inversa.

Exemplo 2:

# Vamos primeiro criar uma lista para demonstrar o fatiamento
# lst contém todos os números de 1 a 10
lst =list(range(1, 11))
print(lst)

# a lista abaixo tem números de 2 a 5
lst1_5 = lst[1:5]
print(lst1_5)

# a lista abaixo tem números de 6 a 8
lst5_8 = lst[5:8]
print(lst5_8)

# a lista abaixo tem números de 2 a 10
lst1_ = lst[1:]
print(lst1_) 

# a lista abaixo tem números de 1 a 5
lst_5 = lst[:5]
print(lst_5)

# a lista abaixo tem números de 2 a 8 no paso 2
lst1_8_2 = lst[1:8:2]
print(lst1_8_2)

# a lista abaixo tem números de 10 a 1
lst_rev = lst[::-1]
print(lst_rev)

# a lista abaixo tem números de 10 a 6 na etapa 2
lst_rev_9_5_2 = lst[9:4:-2]
print(lst_rev_9_5_2)

Resultado:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[2, 3, 4, 5]
[6, 7, 8]
[2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5]
[2, 4, 6, 8]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[10, 8, 6]

Podemos usar a função filter para filtrar uma lista com base em alguma condição fornecida como uma expressão lambda como primeiro argumento e lista como segundo argumento, exemplo disso é mostrado abaixo:

Exemplo 3:

import functools 

# filtrando números ímpares 
lst = filter(lambda x : x % 2 == 1, range(1, 20)) 
print(list(lst))

# filtrando quadrados ímpares que são divisíveis por 5
lst = filter(lambda x : x % 5 == 0,
    [x ** 2 for x in range(1, 11) if x % 2 == 1])
print(list(lst))

# filtrando números negativos
lst = filter((lambda x: x < 0), range(-5,5))
print(list(lst))

# implementando a função max()
print(functools.reduce(lambda a,b: a if (a > b) else b, [7, 12, 45, 100, 15])) 

Resultado:

[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
[25]
[-5, -4, -3, -2, -1]
100

Artigo escrito por Utkarsh Trivedi e melhorado por ManasChhabra2, ramalaiguhan e traduzido por Acervo Lima de Python List Comprehension and Slicing

0 comentários:

Postar um comentário