2008-11-03 12 views
5

Tengo un archivo de texto de direcciones URL, aproximadamente 14000. A continuación se muestra un par de ejemplos:filtro de Python/eliminar direcciones URL de una lista

http://www.domainname.com/pagename?CONTENT_ITEM_ID=100&param2=123
http://www.domainname.com/images?IMAGE_ID=10
http://www.domainname.com/pagename?CONTENT_ITEM_ID=101&param2=123
http://www.domainname.com/images?IMAGE_ID=11
http://www.domainname.com/pagename?CONTENT_ITEM_ID=102&param2=123

He cargado el archivo de texto en una lista de Python y estoy tratando de obtener todas las URL con CONTENT_ITEM_ID separadas en una lista de el suyo ¿Cuál sería la mejor manera de hacer esto en Python?

Saludos

Respuesta

21

Aquí es otra alternativa a Graeme, utilizando la nueva sintaxis de lista por comprensión:

list2= [line for line in file if 'CONTENT_ITEM_ID' in line] 

Qué prefieres es una ¡cuestion de gusto!

+0

+1: Mi gusto es evitar lambdas. –

5
list2 = filter(lambda x: x.find('CONTENT_ITEM_ID ') != -1, list1) 

El filtro de llama a la función (primer parámetro) en cada elemento de lista1 (segundo parámetro). Si la función devuelve verdadero (distinto de cero), el elemento se copia a la lista de salida.

La lambda básicamente crea una función temporal sin nombre. Esto es sólo para evitar tener que crear una función y luego pasarlo, así:

function look_for_content_item_id(elem): 
    if elem.find('CONTENT_ITEM_ID') == -1: 
     return 0 
    return 1 
list2 = filter(look_for_content_item_id, list1) 
6

Me gustó la respuesta de @ bobince (+1), pero aumentará la apuesta.

Dado que tiene un conjunto inicial bastante grande, es posible que desee evitar cargar toda la lista en la memoria. A menos que necesite toda la lista para otra cosa, se puede utilizar un Python generator expression para llevar a cabo la misma tarea mediante la creación de elemento de lista filtrada por elemento a medida que se solicitan:

for filtered_url in (line for line in file if 'CONTENT_ITEM_ID' in line): 
    do_something_with_filtered_url(filtered_url) 
+1

error de sintaxis, desequilibrado) – hop

5

Para completar; También puede usar ifilter. Es como un filtro, pero no crea una lista.

from itertools import ifilter 

for line in ifilter(lambda line: 'CONTENT_ITEM_ID' in line, urls): 
    do_something(line) 
Cuestiones relacionadas