Manipulação de Listas em Python

Listas são um dos principais tipos de dados em Python. Você verá que cobriremos bastante conteúdo nesta seção, mas saiba que dominar o funcionamento de listas em Python fará com que você seja muito mais produtivo ao programar.

Em Python, listas de objetos são representadas pelo tipo list. Esse tipo de dados é basicamente uma sequência de elementos, que podem ou não ser do mesmo tipo.

Vejamos alguns exemplos básicos de operações envolvendo listas.

# Cria uma lista sem nenhum elemento.
# A expressão lista_vazia = list() possui o mesmo efeito.
lista_vazia = []
print("Lista vazia: ", lista_vazia)
print("Tipo de uma lista: ", type(lista_vazia))

lista_inteiros = [10, 20, 30, 40]
print("Lista de inteiros: ", lista_inteiros)

lista_tipos_diferentes = ["George", "Orwell", 1984]
print("Lista de elementos com tipos diferentes: ", lista_tipos_diferentes)
Lista vazia:  []
Tipo de uma lista:  <class 'list'>
Lista de inteiros:  [10, 20, 30, 40]
Lista de elementos com tipos diferentes:  ['George', 'Orwell', 1984]

Python permite também a criação de listas aninhadas (uma lista dentro da outra). Este recurso é útil quando desejamos criar listas de várias dimensões (ou matrizes):

lista_aninhada = [1, [2, [3, [4]]], 5]
print("Lista aninhada: ", lista_aninhada)

matriz = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print("Matriz 3x3: ", matriz)

# A sintaxe abaixo será explicada posteriormente.
print("Matriz impressa de outra forma:")
for lista in matriz:
    for elemento in lista:
        print(elemento, end=' ')
    print()
Lista aninhada:  [1, [2, [3, [4]]], 5]
Matriz 3x3:  [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Matriz impressa de outra forma:
1 2 3
4 5 6
7 8 9

Percorrendo Listas

Linguagens de programação como C, C++ e Java usam índices para iterar sobre listas de elementos. Em Python, normalmente percorremos listas de elementos sem que existam índices associados a eles. Entretanto, em algumas situações desejamos percorrer uma lista (de números, por exemplo) em determinada ordem, índice por índice. Python nos permite fazer por meio de intervalos, usando a função range(), como mostrado abaixo:

# Sintaxe da função range().

inicio = 0
fim = 100
passo = 10

# Convertendo um intervalo em uma lista.
print(list(range(inicio, fim, passo)))
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

Perceba que o elemento final do intervalo (no caso acima, o 100) não é retornado pela função range(). O exemplo abaixo mostra isso melhor. Além disso, se não fornecermos o passo, a função irá usar o valor padrão 1.

# Funcionamento da função range. Note que o 10 não é incluído no resultado.
print(list(range(0, 10)))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Em algumas situações, desejamos imprimir ou percorrer os elementos de uma lista em uma ordem específica. Para isso, podemos ordenar a lista. Python provê métodos para isso, conforme mostrado nos seguintes exemplos:

# Ordenando listas.
lista = [7, 25, 2, 3, 30, 7, 80, 100, -1, 15]
print("Lista não ordenada: ", lista)

lista.sort()
print("Lista ordenada: ", lista)

lista.sort(reverse=True)
print("Lista ordenada em ordem decrescente: ", lista)
Lista não ordenada:  [7, 25, 2, 3, 30, 7, 80, 100, -1, 15]
Lista ordenada:  [-1, 2, 3, 7, 7, 15, 25, 30, 80, 100]
Lista ordenada em ordem decrescente:  [100, 80, 30, 25, 15, 7, 7, 3, 2, -1]

Os exemplos acima mostram como ordenar listas em Python de forma forma que chamamos in place. Isso quer dizer que a lista foi ordenada sem que espaço adicional fosse usado.

Python nos permite também ordenar uma cópia da lista original e retornar essa cópia ordenada da lista. Assim, a lista original permanece inalterada e uma nova lista ordenada é criada e retornada. Veja como isso funciona:

# Ordenando listas.
lista = [7, 2, 3, 7, -1, 9]
print("Lista original antes da ordenação: ", lista)

lista_ordenada = sorted(lista)
print("Lista ordenada: ", lista_ordenada)

print("A lista original permanece inalterada: ", lista)
Lista original antes da ordenação:  [7, 2, 3, 7, -1, 9]
Lista ordenada:  [-1, 2, 3, 7, 7, 9]
A lista original permanece inalterada:  [7, 2, 3, 7, -1, 9]

A menos que você precise tanto da lista original quanto de uma cópia dessa lista ordenada, recomenda-se o uso da ordenação in place, uma vez que ela não cria uma lista nova, e portanto usa menos espaço em memória.

Modificando Listas

Em algumas situações, é preciso adicionar, remover ou modificar elementos em uma lista. Python nos provê recursos para fazer essas coisas. Veja:

# Cria uma lista vazia.
lista = []

# Adiciona elementos no final da lista.
lista.append("P")
lista.append("Y")
lista.append("T")
lista.append("H")
lista.append("O")
lista.append("N")

print(lista)
['P', 'Y', 'T', 'H', 'O', 'N']

É possível modificar elementos em uma lista. Dizemos que listas são tipos de dados mutáveis. Este conceito ficará mais interessante quando estudarmos tuplas, que são tipos de dados imutáveis.

lista[1] = 'A'
lista[3] = 'R'
lista[4] = 'I'
lista[5] = 'A'

print(lista)
['P', 'A', 'T', 'R', 'I', 'A']

Python possui um outro recurso, chamado extend para adicionar elementos ao final de uma lista. Vejamos como esse recurso funciona.

bolo = ['farinha de trigo', 'ovo', 'leite', 'manteiga']
bolo.append(['açucar', 'fermento'])
print(bolo)
['farinha de trigo', 'ovo', 'leite', 'manteiga', ['açucar', 'fermento']]

Perceba que o append adicionou a lista ['açucar', 'fermento'] à lista bolo. Mas talvez desejássemos adicionar 'açucar' e 'fermento' como elementos da lista bolo, e não como uma lista dentro de uma lista. O extend nos permite fazer isso.

bolo = ['farinha de trigo', 'ovo', 'leite', 'manteiga']
bolo.extend(['açucar', 'fermento'])
print(bolo)
['farinha de trigo', 'ovo', 'leite', 'manteiga', 'açucar', 'fermento']

A função append sempre insere elementos no final da lista. Isso é bom por questões de desempenho. É mais rápido inserir elementos no final de uma lista porque não precisamos percorrer a lista procurando a posição onde o elemento deve ser inserido. Mas também é possível inserir elementos em posições específicas da lista, usando a função insert.

lista = ['P', 'T', 'H', 'N']
lista.insert(1, "Y")
lista.insert(4, "O")

print(lista)
['P', 'Y', 'T', 'H', 'O', 'N']

Como dissemos antes, listas são mutáveis, logo, é possível remover elementos delas.

lista = ['A', 'S', 'C', 'E', 'N', 'D', 'E', 'R']
print("Lista original: ", lista)

lista.remove("S")
print("Removendo um elemento: ", lista)
Lista original:  ['A', 'S', 'C', 'E', 'N', 'D', 'E', 'R']
Removendo um elemento:  ['A', 'C', 'E', 'N', 'D', 'E', 'R']

Para remover um elemento em uma posição específica, usamos del. Note a diferença em relação à função remove, que recebe como parâmetro o valor que desejamos remover.

lista = ['A', 'S', 'C', 'E', 'N', 'D', 'E', 'R']
print("Lista original: ", lista)

del lista[1]
print("Removendo um elemento: ", lista)
Lista original:  ['A', 'S', 'C', 'E', 'N', 'D', 'E', 'R']
Removendo um elemento:  ['A', 'C', 'E', 'N', 'D', 'E', 'R']

Vejamos agora como criar uma lista dentro de um laço de repetição. No exemplo abaixo, começamos com uma lista de frutas e desejamos criar uma lista com os nomes dessas frutas no plural. Vejamos uma forma de se fazer isso:

# Criando uma lista dentro de um for.
frutas = ['laranja', 'banana', 'abacate', 'manga']
plurais_frutas = []
for fruta in frutas:
    plural = fruta + 's'
    plurais_frutas += [plural]
print(plurais_frutas)
['laranjas', 'bananas', 'abacates', 'mangas']

Para mais detalhes sobre o funcionamento de listas em Python, digite help(list) na linha de comandos do interpretador Python.

Strings versus Listas

Como mencionado anteriomente, listas e strings possuem um funcionamento bem parecido em Python. Em muitas situações, entretanto, é preciso convertermos um tipo no outro. Python oferece meios de se fazer isso, como mostrado abaixo.

# Converte uma string em uma lista.
# O mesmo resultado é obtido se usarmos s = "Ordem e Progresso".split()
s = list("Ordem e Progresso")
print(s)

# Converte uma lista em uma string.
l = ['O', 'r', 'd', 'e', 'm', ' ', 'e', ' ', 'P', 'r', 'o', 'g', 'r', 'e', 's', 's', 'o']
print(''.join(l))
['O', 'r', 'd', 'e', 'm', ' ', 'e', ' ', 'P', 'r', 'o', 'g', 'r', 'e', 's', 's', 'o']
Ordem e Progresso

Em linguagens como C, uma string é basicamente uma lista (um arranjo, para ser mais exato) de caracteres. Em Python isso é diferente: uma lista de caracteres é diferente de uma string.

A principal diferença entre strings e listas em Python é que strings são imutáveis, enquanto listas são mutáveis. Quando tentamos modificar uma strings estamos, na verdade, criando uma nova string com as modificações feitas. Em se tratando de listas, as modificações são feitas sem que se crie uma nova cópia da lista.

Existem também algumas nuances com relação à conversão de strings para listas e de listas para strings. Nos exemplos acima, convertemos uma string ("Ordem e Progresso") em uma lista de caracteres, e ao imprimir a lista vemos que a representação da string muda (ela passa a ser uma lista de caracteres). No exemplo seguinte, convertemos a lista de caracteres de volta para uma string usando a função join, e vemos que a representação da string muda novamente (ela volta a ser uma string). Nestes casos, estamos criando novos objetos (strings ou listas) toda vez que convertemos um objeto em outro.

Fique atento a estas diferenças. A sintaxe para se manipular strings é muito parecida com a sintaxe para se manipular listas, mas strings e listas são coisas diferentes em Python.

Resumo de Operações em Listas

A tabela abaixo mostra um resumo dos principais operadores para manipulação de listas em Python.

Tabela 1. Operações em strings
Operador Descrição Exemplo

+

concatena (soma) duas listas

[1, 2, 3] + [4, 5] retorna [1, 2, 3, 4, 5]

*

repete (replica) uma lista múltiplas vezes

[0, 1] * 2 retorna [0, 1, 0, 1]

[i]

retorna o i-ésimo elemento da lista

[10, 20, 30][1] retorna 20

[i:j]

retorna a sub-lista que vai dos índices i até j - 1

[1, 3, 5, 7, 9][1:3] retorna [3, 5]

Exercícios

  • Escreva uma função que recebe uma lista ou string x e retorna x concatenada com ela mesma.

Clique para ver a solução
def concatena(x):
    return x + x

print(concatena('ha'))
haha

Outra opção é implementar a função assim:

def concatena(x):
    return 2 * x

print(concatena('ha'))
haha
  • Escreva uma função que recebe como entrada uma lista de números e retorna a quantidade de elementos que aparecem uma única vez na lista.

Clique para ver a solução

Podemos resolver este exercício de várias formas, mas na sugestão de solução abaixo mostramos como converter uma lista em um conjunto (set) para contar os elementos únicos presentes na lista. Por definição, um set em Python não armazena elementos repetidos, então é importante ter essa estrutura de dados em mente ao lidar com problemas que pedem para identificar itens/elementos únicos.

def conta_elementos_unicos(numeros):
    elementos_unicos = set(numeros)
    return len(elementos_unicos)

print(conta_elementos_unicos([1, 1, 2, 3, 3, 4]))
4