5

我有一个 URL 的文本文件,大约 14000。下面是几个例子:

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

我已将文本文件加载到 Python 列表中,并试图将所有带有 CONTENT_ITEM_ID 的 URL 分离到它们自己的列表中。在 Python 中执行此操作的最佳方法是什么?

干杯

4

4 回答 4

21

这是 Graeme 的另一种替代方法,使用较新的列表理解语法:

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

你喜欢哪个是口味问题!

于 2008-11-03T11:45:47.053 回答
6

我喜欢@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)
于 2008-11-03T12:32:06.850 回答
5
list2 = filter( lambda x: x.find( 'CONTENT_ITEM_ID ') != -1,  list1 )

过滤器对 list1 的每个元素(第二个参数)调用函数(第一个参数)。如果函数返回 true(非零),则将元素复制到输出列表。

lambda 基本上创建了一个临时的未命名函数。这只是为了避免必须创建一个函数然后传递它,如下所示:

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 )
于 2008-11-03T11:37:13.687 回答
5

为了完整性;您也可以使用ifilter. 它就像过滤器,但不建立一个列表。

from itertools import ifilter

for line in ifilter(lambda line: 'CONTENT_ITEM_ID' in line, urls):
    do_something(line)
于 2008-11-03T12:40:37.380 回答