2009-10-16 18 views
14

que tienen la siguiente estructura de datos:¿Cuál es la mejor manera de buscar un valor de diccionario de Python en una lista de diccionarios?

data = [ 
     {'site': 'Stackoverflow', 'id': 1}, 
     {'site': 'Superuser', 'id': 2}, 
     {'site': 'Serverfault', 'id': 3} 
    ] 

que desea buscar en la lista anterior para ver si tiene algún sitio con un valor específico. Por ejemplo, busque lo anterior para ver si la lista contiene un diccionario con site = 'Superuser' y devuelve True/False. Puedo hacer lo anterior de la forma habitual de recorrer cada elemento y compararlos. ¿Hay alguna manera alternativa de lograr una búsqueda?

+3

Hay optimizaciones si se ordena los datos. Si no, solo usa la solución 'any()'. – Triptych

Respuesta

25
any(d['site'] == 'Superuser' for d in data) 
+9

Wow, publicamos el * mismo contenido * exactamente en 10 segundos el uno del otro. Supongo que eliminaré el mío. :( – FogleBird

+1

tenga en cuenta que esto es exactamente "iterar sobre cada elemento y compararlos", que es lo que Thierry Lam no quería. – nosklo

+0

Creo que se refería a un bucle 'for' normal. –

4

Las listas requieren absolutamente bucles. Para eso están las listas.

Para evitar el bucle, debe evitar las listas.

Quiere los diccionarios de claves de búsqueda y objetos.

sites = dict((d['site'],d) for d in data) 
ids = dict((d['id'],d] for d in data) 

ya se puede encontrar el elemento asociado con 'superusuario' con sites["Superuser"] usando una búsqueda de hash en lugar de un bucle.

9
filter(lambda x: x['site']=='Superuser', data) 
1

no estoy seguro de la sintaxis de Python, pero podría funcionar para usted de esta manera. Mientras construye su estructura de datos primaria, también cree una paralela que sea un conjunto asociativo o hash codificado en el nombre del sitio; luego, para ver si existe un sitio determinado, intente realizar una búsqueda en el hash con el nombre del sitio. Si tiene éxito, usted sabe que hay un registro en su estructura de datos para ese sitio y lo ha hecho en el momento de la búsqueda hash (probablemente O (1) u O (log2 (n)) dependiendo de la técnica hash) en su lugar del O (n/2) de la lista transversal.

(actualizado mientras se escribe: esto es más o menos lo publicó S. Lott)

Cuestiones relacionadas