16 One-Liners Python: Simplifique Suas Tarefas!

Interessado em criar código elegante e com a essência do Python? Apresentamos uma seleção de *one-liners* práticos em Python para simplificar suas tarefas mais frequentes.

Se você está começando sua jornada na programação com Python, provavelmente está dedicando tempo para compreender as estruturas de dados fundamentais, como listas e strings. Muitas operações sobre essas estruturas podem ser executadas com linhas de código concisas, os chamados *one-liners*.

Como desenvolvedor, a legibilidade e a facilidade de manutenção devem ser suas prioridades, ao invés de apenas tentar deixar o código o mais curto possível. No entanto, o Python possibilita a criação de *one-liners* que respeitam as boas práticas de codificação.

Neste artigo, exploraremos *one-liners* para manipulação de listas e strings em Python.

Vamos começar!

Gerar uma lista de números

A forma mais simples de gerar uma lista numérica é através da função `range()`. Essa função retorna um objeto que pode ser transformado em lista. Ao usar `range(num)`, você obtém a sequência 0, 1, 2, …, num-1.

>>> numeros = list(range(10))
>>> numeros
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Aprenda mais sobre como utilizar a função `range()`.

Você pode também usar a função `range()` com um valor de incremento opcional. Assim, `range(inicio, fim, incremento)` produzirá a sequência: inicio, inicio + incremento, inicio + 2*incremento, e assim por diante. O último valor será inicio + k*incremento, onde (inicio + k*incremento) < fim e (inicio + (k+1)*incremento) > fim.

Encontrar os valores máximo e mínimo em uma lista

As funções nativas `max` e `min` permitem calcular, respectivamente, os valores máximo e mínimo em uma lista.

>>> minimo, maximo = min(numeros), max(numeros)
>>> minimo
0
>>> maximo
9

📑 Nota sobre Atribuição Múltipla

Observe que atribuímos valores a `minimo` e `maximo` em uma única declaração de atribuição. Python oferece suporte a essa forma de atribuição múltipla, que é bastante útil ao desempacotar iteráveis e atribuir valores a diversas variáveis simultaneamente.

Remover duplicatas de uma lista

Outra operação comum é a remoção de duplicatas em listas. Isso é necessário quando você precisa trabalhar apenas com valores únicos. A maneira mais simples de fazer isso é converter a lista em um conjunto (*set*).

Um conjunto é uma estrutura de dados que armazena elementos únicos e imutáveis.

>>> numeros_1 = [2,4,7,9,7,10]

Na lista `numeros_1`, o elemento 7 aparece duas vezes. A conversão para um conjunto eliminará a duplicata (o número 7 neste caso), deixando apenas os valores únicos.

Como ainda precisamos de uma lista, iremos converter o conjunto de volta para uma lista. Isso pode ser feito com a seguinte linha de código:

>>> numeros_1 = list(set(numeros_1))
>>> numeros_1
[2, 4, 7, 9, 10]

📒 Para explorar outras técnicas para remover duplicatas de listas em Python, consulte este guia.

Contar ocorrências em uma lista

Para contabilizar quantas vezes um determinado elemento aparece em uma lista, você pode usar o método `count()`. `lista.count(elemento)` retorna a frequência com que `elemento` aparece em `lista`.

>>> numeros
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Na lista `numeros`, o valor 7 aparece uma vez, portanto, o método `count()` retorna 1.

>>> numeros.count(7)
1

Verificar se todos os elementos de uma lista satisfazem uma condição

Para verificar se cada elemento de uma lista atende a um determinado critério, você pode usar a função nativa `all()`.

A função `all()` recebe um iterável como argumento e retorna `True` se todos os elementos desse iterável forem avaliados como `True`.

Vamos verificar se todos os números da lista `numeros_2` são ímpares.

>>> numeros_2 = [3,4,7,11,21,67,12]

Podemos usar *list comprehension* para gerar uma lista de valores booleanos e usar essa lista como argumento para a função `all()`.

Neste caso, `num % 2 != 0` retornará `False` para os números 4 e 12 que são pares. Portanto, a lista de booleanos resultante conterá `False` e, consequentemente, `all(lista)` retornará `False`.

>>> all([num % 2 != 0 for num in numeros_2])
False

💡 É importante notar que `all([])` (ou seja, `all()` com qualquer iterável vazio) sempre retorna `True`.

Verificar se algum elemento da lista satisfaz uma condição

Para verificar se pelo menos um elemento de uma lista satisfaz uma condição, você pode utilizar a função `any()`. `any(lista)` retorna `True` se ao menos um elemento da `lista` for avaliado como `True`.

>>> numeros_2 = [3,4,7,11,21,67,12]

Semelhantemente ao exemplo anterior, usamos *list comprehension* para obter uma lista de booleanos. A lista `numeros_2` contém números pares, portanto a função `any()` retorna `True`.

>>> any([num % 2 for num in numeros_2])
True

Inverter uma String

No Python, strings são imutáveis, então, para inverter uma string, você deve obter uma cópia invertida dela. Existem duas abordagens comuns – ambas podem ser escritas como *one-liners* em Python – que utilizam o fatiamento de strings e funções nativas.

Utilizando o fatiamento de strings

O fatiamento de string com um incremento negativo retorna uma fatia da string começando do final. A sintaxe é `string[inicio:fim:incremento]`. Qual o resultado de definir o incremento como -1 e omitir os índices de inicio e fim?

Retorna uma cópia da string, começando do seu final e incluindo todos os caracteres.

>>> str1 = 'hello'
>>> str1[::-1]
'olleh'

Utilizando a função reverse()

A função nativa `reversed()` retorna um iterador reverso sobre uma sequência.

>>> reversed(str1)
<reversed object at 0x008BAF70>
>>> for char in str1:
...     print(char)
...
h
e
l
l
o

Você pode usá-lo em conjunto com o método `join()`, como mostrado:

>>> ''.join(reversed(str1))
'olleh'

Converter uma String em uma Lista de Caracteres

Suponha que você queira dividir uma string em uma lista de caracteres. Isso pode ser facilmente realizado com *list comprehension*.

>>> str1 = 'hello'

As *list comprehensions* são um dos recursos mais poderosos e concisos do Python.

📒 Saiba mais sobre *list comprehension* em Python.

Iteramos sobre a string e coletamos cada caractere.

>>> caracteres = [char for char in str1]
>>> caracteres
['h', 'e', 'l', 'l', 'o']

Para separar uma string maior em uma lista de strings usando o espaço como delimitador, você pode usar o método `split()`.

>>> str2 = 'hello world'
>>> str2.split()
['hello', 'world']

Vimos como usar *list comprehension* para transformar uma string em lista de caracteres. Nesse exemplo, iteramos sobre a string e coletamos todos os caracteres.

E se precisarmos iterar sobre a string e coletar apenas os dígitos? Como fazer?

  • Podemos definir a condição de filtragem na expressão da *list comprehension* usando o método `isdigit()`.
  • `c.isdigit()` retorna `True` se `c` for um dígito; caso contrário, retorna `False`.
>>> str3 = 'python3'
>>> digitos = [c for c in str3 if c.isdigit()]
>>> digitos
['3']

Verificar se uma string começa com uma substring específica

Para verificar se uma string inicia com uma substring específica, use o método `startswith()`. `str1.startswith(substring)` retorna `True` se `str1` começa com `substring`. Caso contrário, retorna `False`.

Exemplos:

>>> str4 = 'coding'
>>> str4.startswith('co')
True
>>> str5 = 'python'
>>> str5.startswith('co')
False

Verificar se uma string termina com uma substring específica

Como você já deve ter imaginado, para verificar se uma string termina com uma determinada substring, você pode usar o método `endswith()`.

>>> str5 = 'python'
>>> str5.endswith('on')
True

Podemos usar o método de string dentro de uma expressão *list comprehension* para criar `termina_com`, uma lista de booleanos.

>>> strs = ['python','neon','nano','silicon']
>>> termina_com = [str.endswith('on') for str in strs]
>>> termina_com
[True, True, False, True]

Juntar elementos de uma lista em uma string

Vimos como separar uma string em uma lista de caracteres. Agora, como realizar a operação inversa, ou seja, juntar os elementos de uma lista em uma string?

Para isso, utilize o método de string `join()` com a sintaxe: `separador.join(lista)`.

Se você quiser combinar os elementos da lista em uma única string sem nenhum separador, use uma string vazia como separador.

>>> lista_1 = ['p','y','t','h','o','n','3']
>>> ''.join(lista_1)
'python3'

Criar um dicionário Python

Da mesma forma que *list comprehensions* podem auxiliar na construção de listas a partir de iteráveis existentes, *dictionary comprehensions* podem construir dicionários a partir de iteráveis.

*Dictionary comprehensions* em Python são ferramentas concisas e poderosas que permitem construir dicionários dinamicamente.

Vamos usar `nomes`, uma lista de strings.

>>> nomes = ['Joe','Amy','Jake','Florence']

Criaremos `nomes_d`, um dicionário com strings como chaves e o tamanho da string como valor.

>>> nomes_d = {nome:len(nome) for nome in nomes}
>>> nomes_d
{'Joe': 3, 'Amy': 3, 'Jake': 4, 'Florence': 8}

Atribuir valores condicionalmente a variáveis

Às vezes, é necessário atribuir valores a variáveis com base em uma condição específica.

Por exemplo, você pode ler um valor inserido pelo usuário, como a idade de uma pessoa. Dependendo desse valor, você pode decidir se a pessoa pode ou não participar de um evento.

Para realizar essa atribuição condicional em Python, você pode escrever o seguinte *one-liner* utilizando o operador ternário.

>>> idade = 21
>>> permitido = True if idade >= 18 else False
>>> permitido
True

🔖 Saiba mais sobre o operador ternário em Python.

Gerar Todas as Permutações

Permutação refere-se a um possível arranjo dos elementos de um grupo. Se um grupo possui *n* elementos únicos, há *n!* formas de organizá-los – e, portanto, *n!* permutações.

Vamos usar as seguintes letras:

>>> letras = ['a','b','c']

Utilize a função `permutations` do módulo `itertools` para gerar todas as permutações possíveis de um iterável.

>>> letras_p = permutations(letras)
>>> letras_p
<itertools.permutations object at 0x0127AF50>

Como visto, `permutations(iteravel)` retorna um objeto de permutação que pode ser percorrido em um laço `for`:

>>> for p in letras_p:
...     print(p)
...
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')

Podemos transformar isso em um *one-liner* convertendo o objeto de permutação para uma lista:

>>> letras_p = list(permutations(letras))
>>> letras_p
[('a', 'b', 'c'), ('a', 'c', 'b'), ('b', 'a', 'c'), ('b', 'c', 'a'), ('c', 'a', 'b'), ('c', 'b', 'a')]

Neste caso, há três elementos únicos, e, portanto, 3!=6 permutações possíveis.

Gerar subconjuntos de uma lista

Às vezes, é necessário construir todos os subconjuntos possíveis de um tamanho específico de uma lista. Vamos usar a lista de letras para obter todas as sublistas de tamanho 2.

Para isso, podemos utilizar a função `combinations` do módulo `itertools`:

>>> from itertools import combinations
>>> letras_2 = list(combinations(letras,2))
>>> letras_2
[('a', 'b'), ('a', 'c'), ('b', 'c')]

Conclusão

Neste tutorial, exploramos diversos *one-liners* em Python para realizar operações comuns em listas e strings. Aprendemos também sobre *list comprehensions* e *dictionary comprehensions* e como utilizá-las em conjunto com as funções nativas para atingir nossos objetivos.

Para dar o próximo passo, consulte esta lista de projetos em Python ideais para iniciantes.