5

約 14000 の URL のテキスト ファイルがあります。以下にいくつかの例を示します。

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 (2 番目のパラメーター) の各要素に対して関数 (最初のパラメーター) を呼び出します。関数が 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 )
于 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 に答える