Tengo una lista de dictados:
list = [{'id':'1234','name':'Jason'},
{'id':'2345','name':'Tom'},
{'id':'3456','name':'Art'}]
¿Cómo puedo encontrar eficientemente la posición del índice [0], [1] o [2] haciendo coincidir el nombre = 'Tom'?
Si se tratara de una lista unidimensional, podría hacer list.index () pero no estoy seguro de cómo proceder buscando los valores de los dictados dentro de la lista.
{ 'Jason': {'id': '1234'}, 'Tom': {'id': '1245'}, ...}
?){'1234': {'name': 'Jason'}, ...}
. No es que eso ayude a este caso de uso.Respuestas:
Si necesita buscar repetidamente desde el nombre, debe indexarlos por nombre (usando un diccionario), de esta forma las operaciones de obtención serían O (1) vez. Una idea:
fuente
next()
para esto me parece extraño), el objetivo es solo obtener el índice. Además, esto genera StopIteration, mientras que ellst.index()
método Python genera ValueError.first()
suena mejor Siempre puede intentar / excepto StopIteration y aumentar ValueError para que la persona que llama tenga coherencia. Alternativamente, establezcanext()
el valor predeterminado en -1.SyntaxError: Generator expression must be parenthesized if not sole argument
al hacer eso.next((index for (index, d) in enumerate(lst) if d["name"] == "Tom"), None)
Una versión simple y legible es
fuente
str.find()
bien. También puede llamarloindex()
y aumentar un enValueError
lugar de devolver -1 si eso es preferible.No será eficiente, ya que debe recorrer la lista comprobando cada elemento (O (n)). Si quieres eficiencia, puedes usar dict of dicts . En cuanto a la pregunta, aquí hay una forma posible de encontrarla (aunque, si desea apegarse a esta estructura de datos, en realidad es más eficiente usar un generador como Brent Newey ha escrito en los comentarios; ver también la respuesta de tokland):
fuente
Aquí hay una función que encuentra la posición de índice del diccionario si existe.
fuente
Parece más lógico usar un combo de filtro / índice:
Y si crees que podría haber múltiples coincidencias:
fuente
La respuesta ofrecida por @faham es agradable, pero no devuelve el índice al diccionario que contiene el valor. En su lugar, devuelve el diccionario en sí. Aquí hay una manera simple de obtener: Una lista de índices uno o más si hay más de uno, o una lista vacía si no hay ninguno:
Salida:
Lo que me gusta de este enfoque es que con una simple edición puede obtener una lista de los índices y los diccionarios como tuplas. Este es el problema que necesitaba resolver y encontré estas respuestas. A continuación, agregué un valor duplicado en un diccionario diferente para mostrar cómo funciona:
Salida:
Esta solución encuentra todos los diccionarios que contienen 'Tom' en cualquiera de sus valores.
fuente
¿¡Un trazador de líneas!?
fuente
Para un iterable dado,
more_itertools.locate
produce posiciones de elementos que satisfacen un predicado.more_itertools
es una biblioteca de terceros que implementa recetas de herramientas iterto entre otras herramientas útiles.fuente
fuente