Encontrando elementos en una tupla y filtrándolos.

Suponiendo que tengo una tupla como:

[('text-1','xxx'), ('img-1','iii'), ('img-2','jjj'), ('text-2','xxx')] 

Quiero filtrar la lista y producir una nueva con elementos que comiencen con ‘img’. Así que mi nueva lista se verá como:

 [('img-1','iii'), ('img-2','jjj')] 

¡Gracias!

De una sola mano:

 >>> l = [('text-1','xxx'), ('img-1','iii'), ('img-2','jjj'), ('text-2','xxx')] >>> [t for t in l if t[0].startswith('img')] [('img-1', 'iii'), ('img-2', 'jjj')] 

De otra manera:

 >>> filter(lambda x: x[0].startswith('img'), l) [('img-1', 'iii'), ('img-2', 'jjj')] 

El primero se llama una lista de comprensión. Ver la respuesta del FC para una técnica relacionada. La syntax básica es [{expression} for {item_var_or_vars} in {iterable} if {boolean_expression}] . Es semánticamente equivalente a algo como esto:

 new_list = [] for {item_var_or_vars} in {iterable}: if {boolean_expression}: new_list.append({expression}) 

El bit if {boolean_expression} es opcional, tal como está en el bucle for.

El segundo es simplemente el filter función incorporado, que acepta una función de prueba y un iterable, y devuelve una lista que contiene cada elemento que “pasa” la función de prueba. lambda , si no lo has visto antes, es solo una forma rápida de definir una función. Podrías hacer esto en su lugar:

 def keep_this_element(element): return element[0].startswith('img') # returns True for ('img...', '...') new_list = filter(keep_this_element, l) # keeps only elements that return True 

¿Algo así tal vez?

 l2 = [item for item in l1 if item[0].startswith('img')] 

Solo otra manera con la expresión del generador (podría hacer alguna diferencia en listas grandes)

 >>> l = [('text-1','xxx'), ('img-1','iii'), ('img-2','jjj'), ('text-2','xxx')] >>> (x for x in l if x[0].find('img') == 0) 0:  at 0x917a00> >>> gen = (x for x in l if x[0].find('img') == 0) >>> list(gen) 1: [('img-1', 'iii'), ('img-2', 'jjj')] 
 tuple_filter = lambda t, i, w: filter(lambda a: a[i].startswith(w), t) newtuple = tuple_filter(thetuple, 0, 'img')