我有一个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中执行此操作的最佳方法是什么?
干杯
答案 0 :(得分:21)
这是格雷姆的另一种替代方法,使用更新的列表理解语法:
list2= [line for line in file if 'CONTENT_ITEM_ID' in line]
您更喜欢的是品味问题!
答案 1 :(得分:6)
我喜欢@ bobince的答案(+1),但会提高赌注。
由于你有一个相当大的起始集,你可能希望避免将整个列表加载到内存中。除非您需要其他内容的整个列表,否则您可以使用Python generator expression执行相同的任务,方法是在请求时逐项构建已过滤的列表:
for filtered_url in (line for line in file if 'CONTENT_ITEM_ID' in line):
do_something_with_filtered_url(filtered_url)
答案 2 :(得分: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 )
答案 3 :(得分:5)
为了完整;您也可以使用ifilter
。它就像过滤器,但没有建立列表。
from itertools import ifilter
for line in ifilter(lambda line: 'CONTENT_ITEM_ID' in line, urls):
do_something(line)