2008-11-03 27 views
5

ich eine Textdatei von URLs, etwa 14000. Im Folgenden finden Sie ein paar Beispiele:Python Filter/entfernen URLs aus einer Liste

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

Ich habe die Textdatei in eine Python-Liste geladen und versuche alle URLs mit CONTENT_ITEM_ID getrennt in eine Liste von zu bekommen ihre eigenen. Was wäre der beste Weg, dies in Python zu tun?

Prost

Antwort

21

Hier ist eine andere Alternative zu Graeme, die neuere Liste Verständnis Syntax:

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

, die Sie bevorzugen ein Geschmackssache!

+0

+1: Mein Geschmack ist Lambda zu vermeiden. –

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

Der Filter ruft die Funktion (erster Parameter) auf jedem Element der liste1 (zweiter Parameter). Wenn die Funktion wahr (ungleich Null) zurückgibt, wird das Element in die Ausgabeliste kopiert.

Das Lambda erstellt im Grunde eine temporäre unbenannte Funktion. Dies ist nur eine Funktion zu erstellen, um zu vermeiden, und es dann passieren, wie folgt aus:

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

Ich mochte @ bobince Antwort (+1), aber wird den Ante.

Da Sie eine ziemlich große Startmenge haben, möchten Sie möglicherweise vermeiden, die gesamte Liste in den Speicher zu laden. Wenn Sie nicht die ganze Liste für etwas anderes brauchen, könnten Sie eine Python generator expression verwenden, um die gleiche Aufgabe zu erfüllen, indem die gefilterte Liste Punkt für Punkt den Aufbau, wie sie angefordert sind:

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

Syntaxfehler, unsymmetrisch) – hop

5

Der Vollständigkeit; Sie können auch ifilter verwenden. Es ist wie Filter, aber baut keine Liste auf.

from itertools import ifilter 

for line in ifilter(lambda line: 'CONTENT_ITEM_ID' in line, urls): 
    do_something(line) 
Verwandte Themen