No Python, quando usar um dicionário, lista ou conjunto?

294

Quando devo usar um dicionário, lista ou conjunto?

Existem cenários mais adequados para cada tipo de dados?

Blankman
fonte

Respostas:

603

A listmantém a ordem dicte setnão: quando você se importa com a ordem, portanto, deve usá-la list(se a sua escolha de contêineres for limitada a esses três, é claro ;-).

dictassocia a cada chave um valor, enquanto liste setapenas contém valores: casos de uso muito diferentes, obviamente.

setrequer que os itens sejam laváveis, listnão é necessário: se você tiver itens não laváveis, não poderá usar sete, em vez disso, deverá usá-lo list.

setproíbe duplicados, listnão: também uma distinção crucial. (Um "multiset", que mapeia duplicatas em uma contagem diferente para itens presentes mais de uma vez, pode ser encontrado em collections.Counter- você pode criar uma como a dict, se por algum motivo estranho não puder importar collectionsou, na versão anterior à 2.7 Python como a collections.defaultdict(int), usando os itens como chaves e o valor associado como a contagem).

A verificação da associação de um valor em um set(ou dict, para chaves) é incrivelmente rápida (levando um tempo constante e curto), enquanto em uma lista leva um tempo proporcional ao tamanho da lista nos casos médios e piores. Portanto, se você possui itens que podem ser lavados, não se preocupe com pedidos ou duplicatas e deseja uma verificação rápida da associação, seté melhor que list.

Alex Martelli
fonte
6
Observe que o Python 3.7 tem ditado ordenado por padrão
Gigi Bayte 2/07
172
  • Você só precisa de uma sequência ordenada de itens? Vá para uma lista.
  • Você só precisa saber se você já possui ou não um valor específico, mas sem solicitar (e não precisa armazenar duplicatas)? Use um conjunto.
  • Você precisa associar valores a chaves, para que possa procurá-los com eficiência (por chave) posteriormente? Use um dicionário.
Jon Skeet
fonte
30
Esta deve ser a; parte "TL DR" para a resposta acima por Alex M. :-)
Alex Boschmans
9
Eu acho que é o contrário. Alex deve doar seus votos para Jon. Essa resposta abrange praticamente tudo e é muito mais concisa e clara.
mehmet 2/16
se, no entanto, você gostaria de saber a diferença de complexidade de tempo entre esses tipos de dados, a explicação de Alex funciona melhor
kcEmenike
19

Quando você deseja uma coleção não ordenada de elementos exclusivos, use a set. (Por exemplo, quando você deseja o conjunto de todas as palavras usadas em um documento).

Quando você deseja coletar uma lista ordenada imutável de elementos, use a tuple. (Por exemplo, quando você deseja um par (nome, número de telefone) que deseja usar como elemento em um conjunto, seria necessária uma tupla em vez de uma lista, pois os conjuntos exigem que os elementos sejam imutáveis.

Quando você deseja coletar uma lista ordenada mutável de elementos, use a list. (Por exemplo, quando você deseja acrescentar novos números de telefone a uma lista: [número1, número2, ...]).

Quando você deseja um mapeamento de chaves para valores, use a dict. (Por exemplo, quando você deseja uma lista telefônica que mapeia nomes para números de telefone:) {'John Smith' : '555-1212'}. Observe que as chaves em um ditado não estão ordenadas. (Se você percorrer um ditado (lista telefônica), as teclas (nomes) podem aparecer em qualquer ordem).

unutbu
fonte
Ele não perguntou sobre tuplas.
habnabit
18
  • Use um dicionário quando tiver um conjunto de chaves exclusivas que mapeiam para valores.

  • Use uma lista se você tiver uma coleção ordenada de itens.

  • Use um conjunto para armazenar um conjunto não ordenado de itens.

SLaks
fonte
6

Em resumo, use:

list - se você precisar de uma sequência ordenada de itens.

dict - se você precisar relacionar valores com chaves

set - se você precisar manter elementos únicos.

Explicação detalhada

Lista

Uma lista é uma sequência mutável, normalmente usada para armazenar coleções de itens homogêneos.

Uma lista implementa todas as operações comuns de sequência:

  • x in l e x not in l
  • l[i], l[i:j],l[i:j:k]
  • len(l), min(l),max(l)
  • l.count(x)
  • l.index(x[, i[, j]])- índice da 1ª ocorrência de xem l(em ou após ie antes de jindeces)

Uma lista também implementa todas as operações de sequência mutável:

  • l[i] = x- item ide lé substituído porx
  • l[i:j] = t- fatia de lde ipara jé substituída pelo conteúdo do iterávelt
  • del l[i:j] - igual a l[i:j] = []
  • l[i:j:k] = t- os elementos de l[i:j:k]são substituídos pelos det
  • del l[i:j:k]- remove os elementos de s[i:j:k]da lista
  • l.append(x)- anexa xao final da sequência
  • l.clear()- remove todos os itens de l(o mesmo que del l[:])
  • l.copy()- cria uma cópia superficial de l(o mesmo que l[:])
  • l.extend(t)ou l += t- estende-se lao conteúdo det
  • l *= n- atualizações lcom seu conteúdo repetidas nvezes
  • l.insert(i, x)- insertos xem lno índice fornecido pelai
  • l.pop([i])- recupera o item em ie também o remove del
  • l.remove(x)- remova o primeiro item de londe l[i]é igual a x
  • l.reverse()- inverte os itens do llocal

Uma lista pode ser usada como pilha, aproveitando os métodos appende pop.

Dicionário

Um dicionário mapeia valores hashable para objetos arbitrários. Um dicionário é um objeto mutável. As principais operações de um dicionário são armazenar um valor com alguma chave e extrair o valor fornecido com a chave.

Em um dicionário, você não pode usar como valores de chaves que não sejam laváveis, ou seja, valores que contêm listas, dicionários ou outros tipos mutáveis.

Conjunto

Um conjunto é uma coleção não ordenada de objetos hash distintos. Um conjunto é comumente usado para incluir teste de associação, remover duplicatas de uma sequência e calcular operações matemáticas como interseção, união, diferença e diferença simétrica.

lmiguelvargasf
fonte
5

Embora isso não abranja sets, é uma boa explicação de dicts e lists:

As listas são o que parecem - uma lista de valores. Cada um deles é numerado, começando do zero - o primeiro é numerado como zero, o segundo 1, o segundo 2, etc. Você pode remover valores da lista e adicionar novos valores ao final. Exemplo: nomes de muitos gatos.

Os dicionários são semelhantes ao que o nome sugere - um dicionário. Em um dicionário, você tem um 'índice' de palavras e para cada uma delas uma definição. Em python, a palavra é chamada de 'chave' e a definição de 'valor'. Os valores em um dicionário não são numerados - são semelhantes ao que o nome sugere - um dicionário. Em um dicionário, você tem um 'índice' de palavras e para cada uma delas uma definição. Os valores em um dicionário não são numerados - eles também não estão em nenhuma ordem específica - a chave faz a mesma coisa. Você pode adicionar, remover e modificar os valores nos dicionários. Exemplo: lista telefônica.

http://www.sthurlow.com/python/lesson06/

Ganso
fonte
4

Para C ++, eu sempre tinha esse fluxograma em mente: em que cenário eu uso um contêiner STL específico? , fiquei curioso para saber se algo semelhante também está disponível para o Python3, mas não tive sorte.

O que você precisa ter em mente para o Python é: Não existe um padrão único do Python para o C ++. Portanto, pode haver grandes diferenças para diferentes intérpretes Python (por exemplo, CPython, PyPy). O fluxograma a seguir é para CPython.

Além disso eu descobri nenhuma boa maneira de incorporar os seguintes estruturas de dados para o diagrama de: bytes, byte arrays, tuples, named_tuples, ChainMap, Counter, e arrays.

  • OrderedDicte dequeestão disponíveis via collectionsmódulo.
  • heapqestá disponível no heapqmódulo
  • LifoQueue,, Queuee PriorityQueueestão disponíveis através do queuemódulo projetado para acesso simultâneo (threads). (Também existe um multiprocessing.Queuedisponível, mas não conheço as diferenças, queue.Queuemas considero que ele deve ser usado quando o acesso simultâneo dos processos for necessário.)
  • dict, set, frozen_set, E listsão embutido é claro

Para qualquer um, eu ficaria grato se você pudesse melhorar esta resposta e fornecer um diagrama melhor em todos os aspectos. Sinta-se livre e bem-vindo. fluxograma

PS: o diagrama foi feito com yed. O arquivo graphml está aqui

matemática
fonte
3

Em combinação com listas , dicts e sets , também existem outros objetos python interessantes, OrderedDicts .

Os dicionários ordenados são como dicionários regulares, mas lembram a ordem em que os itens foram inseridos. Ao iterar sobre um dicionário ordenado, os itens são retornados na ordem em que suas chaves foram adicionadas pela primeira vez.

OrderedDicts pode ser útil quando você precisa preservar a ordem das chaves, por exemplo, trabalhando com documentos: É comum precisar a representação vetorial de todos os termos em um documento. Portanto, usando OrderedDicts, você pode verificar com eficiência se um termo foi lido antes, adicionar termos, extrair termos e, depois de todas as manipulações, você pode extrair a representação vetorial ordenada deles.

Federico Caccia
fonte
1

As listas são o que parecem - uma lista de valores. Cada um deles é numerado, começando do zero - o primeiro é numerado como zero, o segundo 1, o segundo 2, etc. Você pode remover valores da lista e adicionar novos valores ao final. Exemplo: nomes de muitos gatos.

As tuplas são como listas, mas você não pode alterar seus valores. Os valores que você desiste primeiro são os valores que você mantém no restante do programa. Novamente, cada valor é numerado a partir de zero, para fácil referência. Exemplo: os nomes dos meses do ano.

Os dicionários são semelhantes ao que o nome sugere - um dicionário. Em um dicionário, você tem um 'índice' de palavras e para cada uma delas uma definição. Em python, a palavra é chamada de 'chave' e a definição de 'valor'. Os valores em um dicionário não são numerados - são semelhantes ao que o nome sugere - um dicionário. Em um dicionário, você tem um 'índice' de palavras e para cada uma delas uma definição. Em python, a palavra é chamada de 'chave' e a definição de 'valor'. Os valores em um dicionário não são numerados - eles também não estão em nenhuma ordem específica - a chave faz a mesma coisa. Você pode adicionar, remover e modificar os valores nos dicionários. Exemplo: lista telefônica.

Nitish Kumar Pal
fonte
1

Quando usá-los, faço uma folha de dicas exaustiva de seus métodos para sua referência:

class ContainerMethods:
    def __init__(self):
        self.list_methods_11 = {
                    'Add':{'append','extend','insert'},
                    'Subtract':{'pop','remove'},
                    'Sort':{'reverse', 'sort'},
                    'Search':{'count', 'index'},
                    'Entire':{'clear','copy'},
                            }
        self.tuple_methods_2 = {'Search':'count','index'}

        self.dict_methods_11 = {
                    'Views':{'keys', 'values', 'items'},
                    'Add':{'update'},
                    'Subtract':{'pop', 'popitem',},
                    'Extract':{'get','setdefault',},
                    'Entire':{ 'clear', 'copy','fromkeys'},
                            }
        self.set_methods_17 ={
                    'Add':{['add', 'update'],['difference_update','symmetric_difference_update','intersection_update']},
                    'Subtract':{'pop', 'remove','discard'},
                    'Relation':{'isdisjoint', 'issubset', 'issuperset'},
                    'operation':{'union' 'intersection','difference', 'symmetric_difference'}
                    'Entire':{'clear', 'copy'}}
Cálculo
fonte
1

Dicionário: um dicionário python é usado como uma tabela de hash com chave como índice e objeto como valor.

Lista: Uma lista é usada para manter objetos em uma matriz indexada pela posição desse objeto na matriz.

Conjunto: um conjunto é uma coleção com funções que podem dizer se um objeto está presente ou não no conjunto.

Srinivas P
fonte