Фильтр Python / удалить URL из списка - PullRequest
5 голосов
/ 03 ноября 2008

У меня есть текстовый файл URL, около 14000. Ниже приведено несколько примеров:

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

Я загрузил текстовый файл в список Python и пытаюсь выделить все URL-адреса с CONTENT_ITEM_ID в отдельный список. Каков наилучший способ сделать это в Python?

Приветствия

Ответы [ 4 ]

21 голосов
/ 03 ноября 2008

Вот еще одна альтернатива Грэму, использующая более новый синтаксис понимания списка:

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

Что вы предпочитаете - дело вкуса!

6 голосов
/ 03 ноября 2008

Мне понравился ответ @ bobince (+1), но я подниду.

Поскольку у вас довольно большой начальный набор, вы можете не загружать весь список в память. Если вам не нужен весь список для чего-то другого, вы можете использовать выражение генератора Python для выполнения той же задачи, создавая отфильтрованный список элементов по элементам в соответствии с их запросами:

for filtered_url in (line for line in file if 'CONTENT_ITEM_ID' in line):
   do_something_with_filtered_url(filtered_url)
5 голосов
/ 03 ноября 2008

для полноты; Вы также можете использовать ifilter. Это как фильтр, но не создает список.

from itertools import ifilter

for line in ifilter(lambda line: 'CONTENT_ITEM_ID' in line, urls):
    do_something(line)
5 голосов
/ 03 ноября 2008
list2 = filter( lambda x: x.find( 'CONTENT_ITEM_ID ') != -1,  list1 )

Фильтр вызывает функцию (первый параметр) для каждого элемента списка list1 (второй параметр). Если функция возвращает true (не ноль), элемент копируется в список вывода.

Лямбда в основном создает временную безымянную функцию. Это просто во избежание необходимости создавать функцию и затем передавать ее, например так:

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 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...