Python: obtener un dict de una lista basada en algo dentro del dict

Necesito poder encontrar un artículo en una list (un artículo en este caso es un dict ) basado en algún valor dentro de ese dict . La estructura de la list que necesito procesar se ve así:

 [ { 'title': 'some value', 'value': 123.4, 'id': 'an id' }, { 'title': 'another title', 'value': 567.8, 'id': 'another id' }, { 'title': 'last title', 'value': 901.2, 'id': 'yet another id' } ] 

Advertencias: el title y el value pueden ser cualquier valor (y el mismo), id sería único.

Necesito poder obtener un dict de esta list basado en una id única. Sé que esto se puede hacer mediante el uso de bucles, pero esto parece incómodo, y tengo la sensación de que hay un método obvio para hacer esto que no estoy viendo gracias a la fusión del cerebro.

 my_item = next((item for item in my_list if item['id'] == my_unique_id), None) 

Esto se repite en la lista hasta que encuentra el primer elemento que coincide con my_unique_id , y luego se detiene. No almacena ninguna lista intermedia en la memoria (mediante el uso de una expresión generadora) ni requiere un bucle explícito. Establece my_item en None no se encuentra ningún objeto. Es aproximadamente lo mismo que

 for item in my_list: if item['id'] == my_unique_id: my_item = item break else: my_item = None 

else cláusulas else for bucles se utilizan cuando el bucle no se termina con una instrucción break .

Si tiene que hacer esto varias veces, debe volver a crear un diccionario indexado por id con su lista:

 keys = [item['id'] for item in initial_list] new_dict = dict(zip(keys, initial_list)) >>>{ 'yet another id': {'id': 'yet another id', 'value': 901.20000000000005, 'title': 'last title'}, 'an id': {'id': 'an id', 'value': 123.40000000000001, 'title': 'some value'}, 'another id': {'id': 'another id', 'value': 567.79999999999995, 'title': 'another title'} } 

o de una manera de una sola línea como lo sugiere agf:

 new_dict = dict((item['id'], item) for item in initial_list) 

Trabajé solo con iter() para mi:

 my_item = next(iter(item for item in my_list if item['id'] == my_unique_id), None) 
 In [2]: test_list Out[2]: [{'id': 'an id', 'title': 'some value', 'value': 123.40000000000001}, {'id': 'another id', 'title': 'another title', 'value': 567.79999999999995}, {'id': 'yet another id', 'title': 'last title', 'value': 901.20000000000005}] In [3]: [d for d in test_list if d["id"] == "an id"] Out[3]: [{'id': 'an id', 'title': 'some value', 'value': 123.40000000000001}] 

Usar lista de comprensión

Puede crear una función simple para este propósito:

 lVals = [{'title': 'some value', 'value': 123.4,'id': 'an id'}, {'title': 'another title', 'value': 567.8,'id': 'another id'}, {'title': 'last title', 'value': 901.2, 'id': 'yet another id'}] def get_by_id(vals, expId): return next(x for x in vals if x['id'] == expId) get_by_id(lVals, 'an id') >>> {'value': 123.4, 'title': 'some value', 'id': 'an id'}