En Python, ¿cuándo usar un diccionario, lista o conjunto?
title in python plot (9)
¿Cuándo debo usar un diccionario, lista o conjunto?
¿Existen escenarios más adecuados para cada tipo de datos?
Aunque esto no cubre los set
s, es una buena explicación de los dict
y la list
s:
Las listas son lo que parecen - una lista de valores. Cada uno de ellos está numerado, comenzando desde cero; el primero está numerado con 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 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 de "valor". Los valores de un diccionario no están numerados, por lo que 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 de un diccionario no están numerados, tampoco están en ningún orden específico, la clave hace lo mismo. Puede agregar, eliminar y modificar los valores en los diccionarios. Ejemplo: guía telefónica.
Cuando desee una colección desordenada de elementos únicos, use un set
. (Por ejemplo, cuando desea el conjunto de todas las palabras utilizadas en un documento).
Cuando desee recopilar una lista ordenada de elementos inmutable, use una tuple
. (Por ejemplo, cuando desee un par (nombre, número de teléfono) que desee utilizar como elemento en un conjunto, necesitará una tupla en lugar de una lista, ya que los conjuntos requieren elementos que sean inmutables).
Cuando desee recopilar una lista ordenada de elementos mutables, utilice una 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 un 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 teclas en un dict están desordenadas. (Si recorre un dictado (guía telefónica), las teclas (nombres) pueden aparecer en cualquier orden).
Cuando los uso, hago una hoja de trucos 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''}}
En combinación con listas , dictados 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 recorrer un diccionario ordenado, los elementos se devuelven en el orden en que se agregaron las claves por primera vez.
OrderedDicts podría ser útil cuando necesite conservar el orden de las claves, por ejemplo, trabajar con documentos: es común que necesite la representación vectorial de todos los términos en un documento. Por lo tanto, utilizando OrderedDicts puede verificar de manera eficiente 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.
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 hay algo similar disponible para Python3 también, pero no tuve suerte.
Lo que debe tener en cuenta para Python es: No existe un estándar único de Python para C ++. Por lo tanto, puede haber grandes diferencias para los diferentes intérpretes de Python (por ejemplo, CPython, PyPy). El siguiente diagrama de flujo es para CPython.
Además, no encontré una buena forma de incorporar las siguientes estructuras de datos en el diagrama: bytes
, byte arrays
, tuples
, named_tuples
, ChainMap
, Counter
y arrays
.
-
OrderedDict
ydeque
están disponibles a través del módulo decollections
. -
heapq
está disponible desde el móduloheapq
-
LifoQueue
,Queue
yPriorityQueue
están disponibles a través del módulo dequeue
que está diseñado para el acceso simultáneo (subprocesos). (También hay unmultiprocessing.Queue
disponible pero no conozco las diferencias conqueue.Queue
a laqueue.Queue
pero supondría que debería usarse cuando se necesita acceso simultáneo desde los procesos) -
dict
,set
,frozen_set
ylist
están incorporados, por supuesto
Para cualquier persona, le agradecería si pudiera mejorar esta respuesta y proporcionar un mejor diagrama en todos los aspectos. Siéntete libre y bienvenido.
PD: el diagrama se ha hecho con yed. El archivo graphml está aquí
Las listas son lo que parecen - una lista de valores. Cada uno de ellos está numerado, comenzando desde cero; el primero está numerado con 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 listas, pero no puedes cambiar sus valores. Los valores que le asignas primero, son los valores con los que estás atascado durante el resto del programa. Nuevamente, cada valor se numera comenzando desde cero, para una referencia fácil. Ejemplo: los nombres de los meses del año.
Los diccionarios 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 de "valor". Los valores de un diccionario no están numerados, por lo que 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 de "valor". Los valores de un diccionario no están numerados, tampoco están en ningún orden específico, la clave hace lo mismo. Puede agregar, eliminar y modificar los valores en los diccionarios. Ejemplo: guía telefónica.
Una list
mantiene el orden, dict
y set
que no: cuando te importa el orden, por lo tanto, debes usar la list
(si la elección de los contenedores está limitada a estos tres, por supuesto ;-).
dict
asocia a cada clave un valor, mientras que la list
y el set
solo contienen valores: casos de uso muy diferentes, obviamente.
set
requiere que los elementos sean hashable, list
no: si tiene elementos no hashable, por lo tanto, no puede usar set
y debe usar la list
.
set
prohíbe duplicados, list
no: también una distinción crucial. (Un "conjunto múltiple", que asigna duplicados en un conteo diferente para los elementos presentes más de una vez, se puede encontrar en collections.Counter
. collections.Counter
: puede crear uno como un dict
, si por alguna extraña razón no puede importar collections
, o , en Python pre-2.7 como collections.defaultdict(int)
, utilizando los elementos como claves y el valor asociado como el recuento).
La verificación de la pertenencia a un valor en un set
(o dict
, para las claves) es increíblemente rápida (toma aproximadamente una constante, poco tiempo), mientras que en una lista lleva un tiempo proporcional a la longitud de la lista en el promedio y en el peor de los casos. Por lo tanto, si tiene elementos hashable, no le importa el orden ni los duplicados, y desea una rápida verificación de la membresía, set
es mejor que list
.
- ¿Solo necesitas una secuencia ordenada de artículos? Ir a por una lista
- ¿Necesita saber si ya tiene un valor en particular, pero sin ordenar (y no necesita almacenar duplicados)? Utilice un conjunto.
- ¿Necesita asociar valores con claves, para poder buscarlas de manera eficiente (por clave) más adelante? Usa un diccionario.
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.
Utilice un conjunto para almacenar un conjunto desordenado de elementos.