1

こんにちは、リストのリストがあり、各リストの値を XML ファイルから抽出した別の値と比較する必要があります。構造は次のようになります。

[('example', '123', 'foo', 'bar'), ('example2', '456', 'foo', 'bar'), ...]

各リストの 2 番目の値を XML の値と比較する必要があります。

for item in main_list:
    for child in xml_data:
        if item[4] == child.get('value'):
            print item[4]

問題は、main_list に大量の行 (1000+) があり、これに xml の値 (100+) を掛けると、多くの反復がこのメソッドの非効率になることです。

これを効率的に行う方法はありますか?

よろしく。

4

1 に答える 1

6

セットのメンバーシップ チェックは、手動で反復してチェックするよりもはるかに高速です。

children = {child.get('value') for child in xml_data}
for item in main_list:
    if item[4] in children:
        print(item[4])

ここでは、単純な集合内包表記で集合を構築します。

セット内のデータを交換する価値があることに注意してください。main_listが長い場合は、そのデータのセットを作成する方が効率的です。

items = {item[4] for item in main_list}
for child in xml_data:
    value = child.get('value')
    if value in items:
        print(value)

これらは両方とも、チェックが行われるたびにではなく、データの処理を 1 回だけ行います。

セットは、セット側で重複する値や順序を処理しないことに注意してください。それが重要な場合、これは有効な解決策ではありません。このバージョンでは、反復処理中のデータからの順序/複製のみが使用されます。それが有効でない場合でも、事前にデータを処理し、 を使用itertools.product()して反復を少し速くすることができます。

items = [item[4] for item in main_list]
children = [child.get('value') for child in xml_data]

for item, child in itertools.product(items, children):
    if item == child:
        print(item)

Karl Knechtel が指摘しているように、複製の順序をまったく気にしない場合は、集合交差を実行できます。

for item in ({child.get('value') for child in xml_data} &
             {item[4] for item in main_list}):
    print(item)
于 2013-05-22T10:16:11.360 に答える