Qual é a Diferença entre Lista e Array em Python?

As diferenças entre lista e array em Python são na performance e nas funcionalidades disponíveis. O array usa menos memória do que a lista, é mais rápido nas operações de leitura e possibilita executar operações matemáticas sobre todos os itens de uma só vez. Além disso, no array todos os elementos têm que ter o mesmo tipo de dado, mas a lista pode ter elementos de tipos diferentes.

Outra diferença é que a lista é uma coleção embutida no Python e o array precisa ser importado do módulo array da biblioteca padrão, ou do pacote Numpy.

Com isso, para declarar uma lista, é só colocar os itens entre colchetes []. Já o array precisa ser inicializado com uma das funções array.array() ou numpy.array().

Se você tem alguma dúvida sobre importação de pacotes em Python, veja esse post completo onde eu explico tudo sobre a declaração import.

Antes de entender quando usar uma lista ou um array, é preciso entender o cenário em que cada uma dessas estruturas é mais útil.

Para isso, veja as características de cada uma dessas estruturas de dados nas seções a seguir.

Eu sugiro que você execute o código Python mostrado nesse post no Jupyter Lab para treinar.

O Jupyter Lab é uma ferramenta ótima para começar a programar e deve fazer parte da sua lista de ferramentas como programador.

Se você ainda não tem o Jupyter Lab instalado, dá uma olhada nesse post onde eu explico o passo-a-passo para a instalação.

Lista em Python

Uma lista em Python é uma coleção ordenada de objetos que pode conter elementos repetidos. Assim como os outros tipos de sequência em Python, cada elemento da lista tem um índice, começando por 0. Usando o índice é possível acessar um elemento específico ou uma fatia da lista. Como a lista é um objeto mutável, após a criação seus elementos podem ser modificados.

Para declarar uma lista, basta colocar seus itens entre colchetes [] e separar cada elemento por uma vírgula. É possível deixar uma vírgula após o último elemento.

Por exemplo:

#  Lista de strings
lista = ['x', 'y', 'z', '8',]

#  Lista de inteiros
lista = [1, 1, 2, 3, 5]

#  Lista vazia
lista = []Code language: Python (python)

Uma lista pode conter diferentes tipos de dados, inclusive outras listas.

#  Lista com tipos de dados diferentes
lista = [False, 'False', 0]

#  Lista aninhada (lista dentro de lista)
lista = [1, 'Texto', [False, 0], []]Code language: Python (python)

Se você ainda não leu o meu post com 13 Dicas Úteis para Manipular Strings em Python do Jeito Mais Fácil, eu sugiro que você faça isso agora.

Lá você vai aprender algumas operações que funcionam da mesma forma em uma string e em uma lista. Por exemplo, como concatenar e fatiar listas.

Assim como pode fazer com uma string, você pode acessar os elementos de uma lista usando seus índices.

Como o primeiro elemento da lista tem índice 0, o último elemento tem índice igual ao tamanho da lista, menos 1.

>>> lista = ['v', 'a', 'i', 'p', 'r', 'o', 'g', 'r', 'a', 'm', 'a', 'r',]
>>> len(lista)
12
>>> lista[0]
'v'
>>> lista[len(lista) - 1]
'r'
>>> lista[-1]
'r'
>>> lista[-12]
'v'Code language: Python (python)

A figura a seguir ilustra os índices da lista do exemplo anterior.

Índices positivos e negativos em uma string Python
Figura 1 – Índices dos elementos de uma lista

De forma diferente da tupla, a lista é um objeto mutável.

Isso significa que é possível adicionar e remover elementos em uma lista, além de alterar o valor dos elementos.

Para adicionar um elemento, use o método append() e para adicionar vários, a partir de outra lista, use o método extend().

>>> lista.append('.')
>>> lista
['v', 'a', 'i', 'p', 'r', 'o', 'g', 'r', 'a', 'm', 'a', 'r', '.']

>>> lista.extend(['c', 'o', 'm',])
>>> lista
['v', 'a', 'i', 'p', 'r', 'o', 'g', 'r', 'a', 'm', 'a', 'r', '.', 'c', 'o', 'm']

>>> lista[12] = '-'
>>> lista
['v', 'a', 'i', 'p', 'r', 'o', 'g', 'r', 'a', 'm', 'a', 'r', '-', 'c', 'o', 'm']Code language: Python (python)

Para aprender como iterar sobre os elementos de uma lista, veja o meu post sobre os laços de repetição for e while em Python.

Esse foi um resumo das características de uma lista.

Na seção a seguir, veja o que é um array em Python.

Array em Python

Um array em Python é uma coleção de elementos que têm o mesmo tipo de dado. Assim como a lista, um array é um objeto mutável e usa um índice para ordenar seus elementos.

Para criar um array em Python, é preciso importar o módulo array ou o pacote numpy.

>>> import array as arr
>>> a = arr.array('i', [1, 2, 3, 4])
>>> a
array('i', [1, 2, 3, 4])

>>> import numpy as np
>>> a = np.array(['a'])
>>> a
array(['a'], dtype='<U1')

#  Array numpy com 10 milhões de números
>>> b = np.arange(10_000_000)
>>> b
array([      0,       1,       2, ..., 9999997, 9999998, 9999999])
>>> b.dtype
dtype('int32')Code language: Python (python)

A forma de realizar operações sobre um objeto array do módulo array é semelhante à forma de manipular uma lista.

Já o array do pacote Numpy conta com métodos otimizados para executar operações sobre seus elementos.

Agora que você já conhece as características da lista e do array em Python, continue lendo para saber quando usar cada um deles.

Qual estrutura de dados você deve usar, lista ou array?

Use uma lista para coleções que tenham poucos elementos, que precisem de muitas inclusões e exclusões, ou que tenham elementos com tipos de dados diferentes. Se a coleção tiver milhares de elementos, ou se precisar realizar operações matemáticas sobre os elementos, use um array.

Eu montei um teste simples para comparar o tempo de execução de uma operação para cada uma dessas opções.

O teste cria uma coleção com 10 milhões de elementos e depois soma 1 a cada elemento. As coleções são um array do módulo array, uma lista e um array do pacote Numpy.

Você pode ver os resultados na imagem abaixo.

Performance da lista e do array com 10 milhões de elementos
Figura 2 – Performance da lista e do array com 10 milhões de elementos

O resultado desse teste mostra que o código que usa uma lista é quase 2 vezes mais rápido que um código semelhante usando um array do módulo array.

No entanto, o código usando o pacote Numpy é quase 50 vezes mais rápido que a versão que usa uma lista.

Essa diferença cresce ainda mais quando o tamanho do array aumenta.

Por isso, se você precisar de uma estrutura de dados versátil para guardar poucos elementos de tipos diferentes, use uma lista.

Mas se tiver um volume muito grande de dados e precisar fazer operações sobre esses dados, use um array do pacote Numpy.

O teste acima mostrou a eficiência do array Numpy quando comparado ao módulo array. Veja na seção a seguir qual array você deve usar para obter o melhor resultado possível.

Qual array você deve usar, o do módulo array ou o do pacote Numpy?

Use o array do módulo Numpy. Ele é otimizado para grandes volumes de dados, tem uma estrutura interna compacta e realiza várias operações em paralelo. Além disso, o array numpy suporta tipos de dados não numéricos e é possível fazer operações matemáticas sobre todos os seus valores com apenas uma instrução.

Já um array criado a partir do módulo array da biblioteca padrão do Python só pode conter números do tipo int ou float, que são mapeados para tipos de dados numéricos da linguagem C.

!

O tipo de dado caractere Unicode era suportado até a versão 3.3 do Python e está previsto para ser removido na versão 4.

Na verdade, é difícil encontrar referências para o módulo array na Internet. Quase todos os resultados de busca para “array Python” se referem ao array do pacote Numpy.

Isso acontece porque o módulo array é usado quando é preciso fazer interface com código em linguagem C.

A estrutura interna desse array usa os tipos de dados nativos dessa linguagem que não existem em Python, como char, short e long, com ou sem sinal. Em qualquer outro cenário, o uso do módulo array não é recomendado.

Portanto, a não ser que você tenha um requisito muito excepcional e não possa usar pacotes de terceiros no seu projeto, a melhor opção é usar o array do pacote Numpy.

Conclusão

Saber a diferença entre uma lista e um array em Python e quando usar cada um é fundamental para que o seu código funcione da melhor maneira possível.

Nesse post você viu as características e o funcionamento dessas estruturas de dados e conheceu os cenários em que cada uma se encaixa melhor.

Viu também que é preferível usar o pacote Numpy em vez do módulo array, sempre que possível.

O que você achou? Tem alguma outra dúvida ou algum outro caso de uso onde um tipo de coleção se aplica melhor que o outro?

Escreva nos comentários e compartilhe a sua experiência. E não esqueça de dizer como eu posso melhorar esse post!

Guilherme Brügger D Amato - Audiência Pública na Comissão Senado do Futuro

Guilherme Brügger D’Amato é servidor concursado de TI na Câmara dos Deputados, onde ocupou o cargo de Diretor de Informática entre 2015 e 2016. Com mais de 26 anos de experiência como programador e executivo de TI, já desenvolveu sites e sistemas usados por dezenas de milhões de pessoas. Conecte-se com ele no LinkedIn ou no Instagram.

Deixe um comentário