2つの大きなリストを交差させるための効率的なアルゴリズム

Cを支払う。

2つのリストa、b、c、dがintであると仮定します。

l1 = [[a,b],[c,d],...[x,y]] # len(l1) = 1 million
l2 = [[a,b],[c,d],...[x,y]) # len(l2) = 10k

欲しいです

l3 = [[c,d],...[x,y]] # items [c,d] in l1 but not l2

使用法:l1は私のテストのペアワイズ結果であり、l2は誤検知です。誤検知を削除したいので、真陽性になります。

私の試み1:ダブルループ、30分ほど遅い

私の試み3:セットが機能しない

私の試み2:二重ループ、しかし内部ループ:アイテムを一致させるとき、両方のl2からそれを削除するので、次の反復では、l2内の1つ少ないアイテムを検索しますが、それでも28分ほど遅くなります

より良いパフォーマンスは大歓迎です。

エリック・デュミニル

内部リストをタプルに変換するだけです。Pythonリストはハッシュ化できないため、セットに入れることはできません。それがあなたの3回目の試みがうまくいかなかった理由だと思います。

減算を設定します

あなたの内側の要素は、(例えばハッシュ可能であればintfloatstring)あなたの内側のリストはタプルに変換され、あなたがセットして計算することが、あなたの外側のリストを変換することができますset1 - set2

import random

l1 = [[random.randrange(10), random.randrange(10)] for _ in range(100)]
l2 = [[random.randrange(10), random.randrange(10)] for _ in range(100)]

# set(l1)
## TypeError: unhashable type: 'list'

set1 = {tuple(l) for l in l1}
set2 = {tuple(l) for l in l2}

print(l1)
# [[0, 9], [9, 7], [8, 7], [6, 7], [1, 4], [2, 7], [8, 9], [8, 7], [5, 0], [3, 8], [8, 1], [6, 3], [5, 2], [0, 5], [2, 0], [2, 4], [7, 8], [2, 3], [4, 6], [4, 4], [3, 1], [7, 5], [2, 6], [8, 5], [6, 0], [0, 0], [4, 8], [5, 2], [1, 8], [6, 8], [9, 7], [0, 8], [5, 5], [4, 6], [0, 7], [0, 8], [7, 8], [5, 3], [2, 4], [1, 0], [8, 8], [6, 5], [8, 9], [7, 0], [8, 0], [1, 1], [1, 3], [2, 6], [3, 8], [7, 2], [6, 8], [3, 9], [1, 9], [9, 8], [3, 8], [1, 2], [1, 1], [2, 5], [7, 8], [3, 9], [0, 6], [9, 4], [4, 6], [9, 6], [8, 9], [7, 2], [4, 6], [9, 0], [0, 7], [0, 1], [5, 6], [5, 1], [1, 5], [9, 1], [8, 9], [4, 5], [4, 0], [4, 2], [1, 7], [9, 7], [4, 7], [1, 6], [9, 2], [7, 0], [9, 8], [3, 7], [9, 9], [9, 9], [0, 7], [3, 0], [0, 4], [4, 7], [9, 9], [0, 4], [9, 1], [2, 9], [7, 7], [5, 6], [6, 4], [7, 4]]
print(l2)
# [[0, 4], [2, 0], [1, 2], [9, 0], [8, 0], [2, 0], [5, 6], [6, 2], [2, 5], [0, 1], [9, 7], [8, 1], [3, 5], [3, 5], [3, 1], [0, 4], [4, 1], [1, 1], [3, 3], [0, 8], [3, 3], [5, 8], [1, 3], [0, 9], [6, 6], [4, 4], [6, 9], [0, 4], [5, 5], [0, 8], [4, 5], [4, 1], [0, 8], [2, 2], [2, 9], [1, 1], [7, 2], [8, 3], [6, 3], [1, 0], [6, 0], [4, 8], [1, 4], [8, 2], [9, 7], [5, 9], [6, 3], [7, 2], [9, 7], [8, 3], [8, 6], [3, 6], [7, 8], [9, 4], [1, 2], [6, 1], [1, 7], [5, 0], [8, 6], [7, 5], [0, 0], [6, 9], [1, 3], [0, 0], [8, 9], [6, 2], [4, 6], [0, 9], [2, 8], [7, 1], [3, 1], [0, 9], [1, 5], [7, 8], [3, 6], [8, 6], [1, 2], [0, 6], [5, 2], [9, 3], [0, 6], [3, 2], [8, 6], [3, 1], [8, 6], [9, 6], [6, 2], [8, 4], [7, 3], [7, 9], [4, 9], [1, 3], [2, 2], [9, 2], [8, 4], [6, 8], [7, 6], [8, 9], [5, 2], [6, 4]]
print(set1 - set2)
# {(4, 7), (9, 1), (3, 0), (9, 8), (7, 7), (0, 7), (1, 6), (3, 7), (5, 1), (8, 5), (4, 0), (6, 7), (2, 6), (3, 9), (0, 5), (2, 3), (8, 7), (1, 9), (4, 2), (6, 5), (5, 3), (2, 7), (7, 0), (9, 9), (3, 8), (7, 4), (1, 8), (8, 8), (2, 4)}

あなたは注文を失いますが、操作は本当に速いです:減算は数秒を要しましたlen(l1) = 1 million and len(l2) = 10k

セットメンバーシップテストによるリスト内包表記

順序とl1重複を保持したい場合は、繰り返してl1、内側のタプルが入っていないかどうかを確認できますset2

print(l1)
# [[2, 2], [3, 2], [7, 8], [0, 2], [4, 7], [3, 9], [8, 1], [4, 6], [9, 1], [8, 3], [7, 2], [2, 7], [1, 2], [0, 2], [9, 4], [5, 8], [9, 6], [3, 8], [8, 8], [1, 2], [7, 5], [0, 2], [0, 3], [3, 1], [0, 1], [5, 8], [3, 5], [6, 3], [7, 3], [9, 2], [6, 1], [4, 3], [6, 4], [0, 5], [9, 8], [6, 2], [3, 7], [4, 7], [8, 4], [0, 6], [0, 7], [5, 3], [2, 0], [0, 7], [2, 6], [9, 1], [0, 6], [5, 0], [7, 6], [8, 1], [3, 1], [9, 3], [2, 2], [4, 4], [3, 2], [2, 6], [5, 6], [3, 8], [3, 1], [4, 0], [2, 1], [6, 0], [4, 8], [3, 6], [4, 0], [9, 3], [6, 7], [7, 9], [4, 4], [4, 1], [5, 2], [6, 2], [2, 3], [1, 1], [9, 9], [9, 3], [9, 9], [7, 4], [2, 1], [6, 8], [5, 2], [4, 0], [4, 8], [4, 2], [5, 2], [6, 0], [5, 9], [9, 7], [1, 9], [7, 6], [1, 9], [7, 0], [9, 0], [6, 0], [7, 0], [0, 8], [8, 0], [1, 5], [8, 4], [7, 5]]
print(l2)
# [[3, 7], [7, 0], [8, 9], [6, 4], [9, 4], [7, 7], [8, 2], [6, 5], [5, 8], [5, 7], [5, 2], [0, 6], [2, 3], [2, 4], [2, 4], [9, 0], [8, 1], [5, 9], [4, 6], [9, 5], [6, 6], [3, 2], [0, 0], [2, 2], [3, 1], [2, 7], [3, 9], [9, 8], [4, 3], [8, 5], [2, 2], [2, 4], [2, 0], [0, 0], [4, 7], [7, 9], [2, 0], [7, 7], [4, 8], [0, 1], [9, 1], [1, 9], [8, 7], [7, 0], [5, 4], [2, 0], [4, 7], [3, 1], [6, 6], [0, 1], [3, 9], [8, 1], [1, 3], [9, 9], [8, 9], [6, 0], [2, 4], [5, 3], [5, 0], [4, 5], [4, 2], [3, 3], [1, 1], [3, 7], [5, 6], [8, 0], [8, 9], [5, 9], [4, 2], [4, 4], [9, 9], [5, 2], [3, 2], [3, 3], [7, 8], [2, 5], [1, 7], [5, 9], [9, 4], [7, 4], [2, 1], [0, 3], [6, 5], [2, 7], [6, 0], [7, 5], [8, 9], [3, 5], [2, 5], [4, 7], [5, 5], [4, 4], [9, 9], [0, 1], [2, 4], [7, 9], [8, 0], [7, 4], [0, 3], [9, 0]]
print([l for l in l1 if tuple(l) not in set2])
# [[0, 2], [8, 3], [7, 2], [1, 2], [0, 2], [9, 6], [3, 8], [8, 8], [1, 2], [0, 2], [6, 3], [7, 3], [9, 2], [6, 1], [0, 5], [6, 2], [8, 4], [0, 7], [0, 7], [2, 6], [7, 6], [9, 3], [2, 6], [3, 8], [4, 0], [3, 6], [4, 0], [9, 3], [6, 7], [4, 1], [6, 2], [9, 3], [6, 8], [4, 0], [9, 7], [7, 6], [0, 8], [1, 5], [8, 4]]

それでも、ダブルループよりもはるかに高速であるはずです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

2つのセットのORを見つけるためのより効率的なアルゴリズム

分類Dev

リスト内の連結されたすべての整数のペアの合計を見つけるための効率的なアルゴリズム

分類Dev

非常に大きな数の整数平方根を1桁ずつ見つけるための効率的なアルゴリズムは何ですか?

分類Dev

2つの配列リスト間の交差を見つけるための効率的なアルゴリズム/方法は何ですか。(私はJava 8を使用しています)

分類Dev

リソースの最も効率的な使用法を見つけるためのアルゴリズム

分類Dev

2つのソートされたリストを交差させるための最速のアルゴリズムは何ですか?

分類Dev

非常に大きな数が7で割り切れるかどうかを見つけるための効率的なアルゴリズム

分類Dev

同じリスト内の要素を比較するための効率的なアルゴリズム

分類Dev

Pythonのリスト内で利用可能な場所をランダムに見つけるための効率的なアルゴリズム

分類Dev

特定のターゲットで有効な式を作成するための効率的なアルゴリズム

分類Dev

黄金比を計算するためのElispの効率的なアルゴリズム

分類Dev

一種の迷路を生成するための効率的なアルゴリズム

分類Dev

大きなcsvファイルをクリーニングするための効率的なアルゴリズム

分類Dev

ダブルスとサブセットを持つサブセットを見つけるための効率的なアルゴリズムは一緒です

分類Dev

Javaで単語を作成するための効率的なアルゴリズム

分類Dev

文字列112123123412345のn番目の桁を見つけるための効率的なアルゴリズム

分類Dev

複数の順序付けられたシーケンスを整列させるための最も効率的なアルゴリズム

分類Dev

整数グリッドの数をカウントするための効率的なアルゴリズム

分類Dev

行列計算のための効率的なアルゴリズム

分類Dev

間隔内の数値の頻度をカウントするための効率的なアルゴリズム

分類Dev

最大のオープンスペースを決定するための効率的なアルゴリズム

分類Dev

「最大連結集合」を見つけるための効率的なアルゴリズムはありますか?

分類Dev

グラフ重心を見つけるための効率的なアルゴリズムとは何ですか?

分類Dev

より大きな配列セット内の個別の配列の数を見つけるためのJavaScriptの効率的なアルゴリズムはありますか?

分類Dev

配列にネストされたオブジェクトを順序付けるための効率的なアルゴリズム

分類Dev

デッドロックなしでペアのリストを処理するための効率的なマルチスレッドアルゴリズム

分類Dev

セットを共通の要素とマージするための効率的な分散アルゴリズム

分類Dev

3つのアレイから最も近いトリプレットを生成するための効率的なアルゴリズム?

分類Dev

オブジェクト内のすべてのアイテムの組み合わせを取得するための効率的なアルゴリズム

Related 関連記事

  1. 1

    2つのセットのORを見つけるためのより効率的なアルゴリズム

  2. 2

    リスト内の連結されたすべての整数のペアの合計を見つけるための効率的なアルゴリズム

  3. 3

    非常に大きな数の整数平方根を1桁ずつ見つけるための効率的なアルゴリズムは何ですか?

  4. 4

    2つの配列リスト間の交差を見つけるための効率的なアルゴリズム/方法は何ですか。(私はJava 8を使用しています)

  5. 5

    リソースの最も効率的な使用法を見つけるためのアルゴリズム

  6. 6

    2つのソートされたリストを交差させるための最速のアルゴリズムは何ですか?

  7. 7

    非常に大きな数が7で割り切れるかどうかを見つけるための効率的なアルゴリズム

  8. 8

    同じリスト内の要素を比較するための効率的なアルゴリズム

  9. 9

    Pythonのリスト内で利用可能な場所をランダムに見つけるための効率的なアルゴリズム

  10. 10

    特定のターゲットで有効な式を作成するための効率的なアルゴリズム

  11. 11

    黄金比を計算するためのElispの効率的なアルゴリズム

  12. 12

    一種の迷路を生成するための効率的なアルゴリズム

  13. 13

    大きなcsvファイルをクリーニングするための効率的なアルゴリズム

  14. 14

    ダブルスとサブセットを持つサブセットを見つけるための効率的なアルゴリズムは一緒です

  15. 15

    Javaで単語を作成するための効率的なアルゴリズム

  16. 16

    文字列112123123412345のn番目の桁を見つけるための効率的なアルゴリズム

  17. 17

    複数の順序付けられたシーケンスを整列させるための最も効率的なアルゴリズム

  18. 18

    整数グリッドの数をカウントするための効率的なアルゴリズム

  19. 19

    行列計算のための効率的なアルゴリズム

  20. 20

    間隔内の数値の頻度をカウントするための効率的なアルゴリズム

  21. 21

    最大のオープンスペースを決定するための効率的なアルゴリズム

  22. 22

    「最大連結集合」を見つけるための効率的なアルゴリズムはありますか?

  23. 23

    グラフ重心を見つけるための効率的なアルゴリズムとは何ですか?

  24. 24

    より大きな配列セット内の個別の配列の数を見つけるためのJavaScriptの効率的なアルゴリズムはありますか?

  25. 25

    配列にネストされたオブジェクトを順序付けるための効率的なアルゴリズム

  26. 26

    デッドロックなしでペアのリストを処理するための効率的なマルチスレッドアルゴリズム

  27. 27

    セットを共通の要素とマージするための効率的な分散アルゴリズム

  28. 28

    3つのアレイから最も近いトリプレットを生成するための効率的なアルゴリズム?

  29. 29

    オブジェクト内のすべてのアイテムの組み合わせを取得するための効率的なアルゴリズム

ホットタグ

アーカイブ