En Python, ¿cuándo usar un Diccionario, Lista o Conjunto?

Respuestas:

603

A listmantiene el orden, dicty setno lo hace: cuando le importa el orden, por lo tanto, debe usar list(si su elección de contenedores se limita a estos tres, por supuesto ;-).

dictasociados con cada valor de la clave A, mientras que listy setsólo contienen valores: muy diferentes casos de uso, obviamente.

setrequiere que los elementos sean hashables, listno: si tiene elementos no hashables, por lo tanto, no puede usar sety debe usar en su lugar list.

setprohíbe duplicados, listno: también una distinción crucial. (Se puede encontrar un "multiset", que asigna duplicados en un recuento diferente para los elementos presentes más de una vez; puede collections.Countercrear uno como dict, si por alguna extraña razón no puede importar collections, o, en versiones anteriores a 2.7 Python como a collections.defaultdict(int), usando los elementos como claves y el valor asociado como el recuento).

Verificar la membresía de un valor en un set(o dict, para claves) es increíblemente rápido (toma aproximadamente un tiempo constante y corto), mientras que en una lista toma tiempo proporcional a la longitud de la lista en el promedio y en los peores casos. Por lo tanto, si tiene elementos que se pueden compartir, no importa el pedido o los duplicados, y desea una verificación rápida de la membresía, setes mejor que list.

Alex Martelli
fuente
66
Tenga en cuenta que Python 3.7 tiene un pedido ordenado por defecto
Gigi Bayte 2
172
  • ¿Solo necesita una secuencia ordenada de artículos? Ve por una lista.
  • ¿Solo necesita saber si ya tiene un valor particular o no , pero sin ordenar (y no necesita almacenar duplicados)? Usa un set.
  • ¿Necesita asociar valores con claves para poder buscarlos de manera eficiente (por clave) más adelante? Usa un diccionario.
Jon Skeet
fuente
30
Esta debería ser la parte "TL; DR" de la respuesta anterior de Alex M. :-)
Alex Boschmans
99
Creo que es al revés ... Alex debería donar sus votos a Jon. Esta respuesta cubre casi todo y es mucho más conciso y claro.
mehmet
sin embargo, si desea saber la diferencia de complejidad de tiempo entre estos tipos de datos, la explicación de Alex funciona mejor
kcEmenike
19

Cuando desee una colección desordenada de elementos únicos, use a set. (Por ejemplo, cuando desea el conjunto de todas las palabras utilizadas en un documento).

Cuando desee recopilar una lista ordenada inmutable de elementos, use a tuple. (Por ejemplo, cuando desea un par (nombre, número de teléfono) que desea usar como elemento en un conjunto, necesitaría una tupla en lugar de una lista, ya que los conjuntos requieren que los elementos sean inmutables).

Cuando desee recopilar una lista ordenada mutable de elementos, use a list. (Por ejemplo, cuando desea agregar nuevos números de teléfono a una lista: [número1, número2, ...]).

Cuando desee una asignación de claves a valores, use a dict. (Por ejemplo, cuando desea una guía telefónica que asigne nombres a números telefónicos:) {'John Smith' : '555-1212'}. Tenga en cuenta que las claves en un dict no están ordenadas. (Si itera a través de un dict (guía telefónica), las claves (nombres) pueden aparecer en cualquier orden).

unutbu
fuente
No preguntó por las tuplas.
habnabit
18
  • Use un diccionario cuando tenga un conjunto de claves únicas que se asignen a valores.

  • Use una lista si tiene una colección ordenada de artículos.

  • Use un conjunto para almacenar un conjunto desordenado de elementos.

SLaks
fuente
6

En resumen, use:

list - si necesita una secuencia ordenada de artículos.

dict - si necesita relacionar valores con claves

set - Si necesita mantener elementos únicos.

Explicación detallada

Lista

Una lista es una secuencia mutable, generalmente utilizada para almacenar colecciones de artículos homogéneos.

Una lista implementa todas las operaciones de secuencia comunes:

  • x in l y 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 de la primera aparición de xin l(en o después iy antes de jindeces)

Una lista también implementa todas las operaciones de secuencia mutable:

  • l[i] = x- el elemento ide lse reemplaza porx
  • l[i:j] = t- el segmento de lfrom ia jse reemplaza por el contenido del iterablet
  • del l[i:j] - igual que l[i:j] = []
  • l[i:j:k] = t- los elementos de l[i:j:k]son reemplazados por los det
  • del l[i:j:k]- elimina los elementos de s[i:j:k]la lista
  • l.append(x)- se agrega xal final de la secuencia
  • l.clear()- elimina todos los elementos de l(igual que del l[:])
  • l.copy()- crea una copia superficial de l(igual que l[:])
  • l.extend(t)o l += t- se extiende lcon el contenido det
  • l *= n- actualizaciones lcon su contenido repetido nveces
  • l.insert(i, x)- se inserta xen lel índice dado pori
  • l.pop([i])- recupera el elemento en iy también lo elimina del
  • l.remove(x)- eliminar el primer elemento de ldonde l[i]es igual a x
  • l.reverse()- invierte los elementos de len su lugar

Una lista podría usarse como pila aprovechando los métodos appendy pop.

Diccionario

Un diccionario asigna valores hashables a objetos arbitrarios. Un diccionario es un objeto mutable. Las operaciones principales en un diccionario son almacenar un valor con alguna clave y extraer el valor dado la clave.

En un diccionario, no puede usar como claves valores que no sean hashables, es decir, valores que contengan listas, diccionarios u otros tipos mutables.

Conjunto

Un conjunto es una colección desordenada de objetos hashables distintos. Un conjunto se usa comúnmente para incluir pruebas de membresía, eliminar duplicados de una secuencia y calcular operaciones matemáticas como intersección, unión, diferencia y diferencia simétrica.

lmiguelvargasf
fuente
5

Aunque esto no cubre sets, es una buena explicación de dictsy lists:

Las listas son lo que parecen: una lista de valores. Cada uno de ellos está numerado, comenzando desde cero: el primero está numerado como cero, el segundo 1, el tercero 2, etc. Puede eliminar valores de la lista y agregar nuevos valores al final. Ejemplo: los nombres de tus muchos gatos.

Los diccionarios son similares a lo que su nombre sugiere: un diccionario. En un diccionario, tiene un 'índice' de palabras, y para cada una de ellas una definición. En python, la palabra se llama 'clave' y la definición un 'valor'. Los valores en un diccionario no están numerados, son similares a lo que sugiere su nombre, un diccionario. En un diccionario, tiene un 'índice' de palabras, y para cada una de ellas una definición. Los valores en un diccionario no están numerados, tampoco están en un orden específico, la clave hace lo mismo. Puede agregar, eliminar y modificar los valores en los diccionarios. Ejemplo: guía telefónica.

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

ganso
fuente
4

Para C ++, siempre tuve en mente este diagrama de flujo: ¿ en qué escenario utilizo un contenedor STL particular? , así que tenía curiosidad por saber si algo similar está disponible para Python3 también, pero no tuve suerte.

Lo que debe tener en cuenta para Python es: no hay un único estándar de Python para C ++. Por lo tanto, puede haber grandes diferencias para diferentes intérpretes de Python (por ejemplo, CPython, PyPy). El siguiente diagrama de flujo es para CPython.

Adicionalmente he encontrado ninguna buena manera de incorporar las siguientes estructuras de datos en el diagrama: bytes, byte arrays, tuples, named_tuples, ChainMap, Counter, y arrays.

  • OrderedDicty dequeestán disponibles a través del collectionsmódulo.
  • heapqestá disponible desde el heapqmódulo
  • LifoQueue, Queuey PriorityQueueestán disponibles a través del queuemódulo diseñado para acceso concurrente (subprocesos). (También hay multiprocessing.Queuedisponible, pero no conozco las diferencias, queue.Queuepero supongo que debería usarse cuando se necesita acceso concurrente desde los procesos).
  • dict, set, frozen_set, Y listson, por supuesto orden interna

Le agradecería a cualquiera que pudiera mejorar esta respuesta y proporcionar un mejor diagrama en cada aspecto. Siéntete libre y bienvenido. diagrama de flujo

PD: el diagrama se ha realizado con yed. El archivo Graphml está aquí.

2 revoluciones
fuente
3

En combinación con listas , dictos y conjuntos , también hay otros objetos interesantes de Python, OrderedDicts .

Los diccionarios ordenados son como los diccionarios normales, pero recuerdan el orden en que se insertaron los elementos. Al iterar sobre un diccionario ordenado, los elementos se devuelven en el orden en que se agregaron sus claves por primera vez.

OrderedDicts podría ser útil cuando necesita preservar el orden de las claves, por ejemplo, trabajar con documentos: es común necesitar la representación vectorial de todos los términos en un documento. Entonces, usando OrderedDicts puede verificar eficientemente si un término se ha leído antes, agregar términos, extraer términos y, después de todas las manipulaciones, puede extraer la representación vectorial ordenada de ellos.

Federico Caccia
fuente
1

Las listas son lo que parecen: una lista de valores. Cada uno de ellos está numerado, comenzando desde cero: el primero está numerado como cero, el segundo 1, el tercero 2, etc. Puede eliminar valores de la lista y agregar nuevos valores al final. Ejemplo: los nombres de tus muchos gatos.

Las tuplas son como las listas, pero no puedes cambiar sus valores. Los valores que le das primero son los valores con los que estás atascado para el resto del programa. Nuevamente, cada valor está numerado a partir de cero, para una fácil referencia. Ejemplo: los nombres de los meses del año.

Los diccionarios son similares a lo que su nombre sugiere: un diccionario. En un diccionario, tiene un 'índice' de palabras, y para cada una de ellas una definición. En python, la palabra se llama 'clave' y la definición un 'valor'. Los valores en un diccionario no están numerados, son similares a lo que sugiere su nombre, un diccionario. En un diccionario, tiene un 'índice' de palabras, y para cada una de ellas una definición. En python, la palabra se llama 'clave' y la definición un 'valor'. Los valores en un diccionario no están numerados, tampoco están en un orden específico, la clave hace lo mismo. Puede agregar, eliminar y modificar los valores en los diccionarios. Ejemplo: guía telefónica.

Nitish Kumar Pal
fuente
1

Cuando los uso, hago una hoja de referencia exhaustiva de sus métodos para su referencia:

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
fuente
1

Diccionario: un diccionario de Python se usa como una tabla hash con clave como índice y objeto como valor.

Lista: se utiliza una lista para contener objetos en una matriz indexada por posición de ese objeto en la matriz.

Conjunto: un conjunto es una colección con funciones que pueden determinar si un objeto está presente o no en el conjunto.

Srinivas P
fuente