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回目の試みがうまくいかなかった理由だと思います。
あなたの内側の要素は、(例えばハッシュ可能であればint
、float
、string
)あなたの内側のリストはタプルに変換され、あなたがセットして計算することが、あなたの外側のリストを変換することができます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]
コメントを追加