2016-08-05 2 views
0

それは最高のタイトルだったかどうかわかりませんが、私は2つのpythonリストを持っています。 L1とL2の両方がタイプTのエレメントを持ち、同じ長さを持たない。2つのリストl1とl2については、すべてのe1∈l1、∃p(e1、e2)に対してチェックするにはどうすればよいでしょう?ここで、e2はl2の要素です。

私はL1のすべての要素Eのことをチェックしたい型T.

の二つの要素についてのプロパティをチェックする述語である関数P(T、T)、P(E、Eを有しています')が成り立つ。ここで、e'はL2のSOME要素である。基本的にL1の各要素については、2番目のリストに行き、述語が要素のいずれかに当てはまるかどうかを確認します。しかし、私はまた、他のリストについても同じことをチェックしたいと思っています。

p(T、T)は対称です。したがって、p(e、e ')ならばp(e'、e)。私はその対称性のために同じことを二度したくない。私は何とかp(e、e ')を見ればp(e'、e)を知っていて、2番目のリストをもう一度チェックする必要はないことを記録する必要があります。

これをPythonで行う最良の方法は何ですか?私は、e2が他のリストのメンバーである場合、p(e1、e2)が成立するかどうかをそれぞれのリストの各要素e1に別のフィールドを持つことを考えました。しかし、私はこれらのリストを両方ともコピーする必要があると思うので、私はそれを変更しません。これを行う良い方法はありますか?

+0

事前計算を行う場合は、L1の各要素についてO(1)時間内にチェックを行うことができます。 LL1のi番目の要素e1に対して、p(e1、e2)となるようなe1がL2内に存在する場合に限りLL1 [i] == 1となるように2つ以上のリストLL1とLL2を作成してください。あなたは全体的な質問への答えを記録することができます(L1のすべてのe1が存在するため...) – Alejandro

+0

[OK]を、私はそのコードで私の質問を編集しました。私はそれがあなたが意味していたものなのかどうかは分かりませんが、それがあれば、それは私には大変意味があります。 – Lana

+0

@Alejandro:それは実際にはどんな仕事も保存しません。事前計算は 'O(n ** 2)'であり、あまり再利用できません。 – user2357112

答えて

2

pが本質的に役に立たないという事実は、本質的に役に立たない。 p(e, e')がわかっている場合、p(e', e)が保持されていますが、ee'の両方が両方のリストにない場合、2回ではなく1回だけ述語評価を利用できます。リストに重複が多い場合でも、対称性を悪用しようとするよりも、pの評価を繰り返す方が効率的です。

チェックを行う最良の方法は、おそらくデータを再編成し、eの構造を利用してより効率的なアルゴリズムを見つけることですが、これまでの情報では解決できませんそれと。私が提案することができる最高は力ずくである:

def check(p, l1, l2): 
    for a in l1: 
     if not any(p(a, b) for b in l2): 
      return False 
    return True 
+0

l1) 'の'については、 'all(any(p(a、b)のl2)はどうですか? –

+0

@tobias_k:うん、それはうまくいくだろう。 – user2357112

0

私はちょうどリストごとに辞書を作成します(dict1dict2することができる)、そしてあなたが最初のリストを反復処理するとき、あなたはdict1[e] = e'dict2[e'] = eの両方を設定します。次に、L2を反復するときは、最初に現在のedict2でないことを確認してください。 eの値が重複している場合は、L1の最初の反復にこのチェックを追加することもできます。私の電話にこれを書いてほしいと思っています。

+0

"あなたは' dict1 [e] = e''と 'dict2 [e '] = e'"の両方を設定しますが、 'e'を見ることによって' e'その逆。そうした場合、これを行うもっと効率的な方法があります。 – user2357112

+0

私はOPがちょうど彼/彼女がeを見つけたら再度チェックを避ける方法を尋ねていると思った ' – Camsbury

+0

そしてそれは対称であるので、eはeです – Camsbury

関連する問題