2016-11-10 10 views
0

は私が簡略化され、大きな辞書は次のようになります:辞書の値を比較し、飛び出るキー

my_dict = {'a': [-33.27, -2.12, 5.23], 'b': [-57.11, 9.82, -26.13], ...}

ので、キーは文字列と値が浮動小数点数のリストであるです。値ペア:

は、私は何をしたい見つけて、いくつかの冗長キーを削除する基準を実行して、それのサイズを小さくすることです。

擬似コードにおける基準がある:すべてのキーiについて

、異なる鍵jが辞書に存在するかどうかを見つけるように:

  • value_of_key_i[0] > value_of_key_j[0] and
  • value_of_key_i[1] > value_of_key_j[1] and
  • abs(value_of_key_i[2]) < abs(value_of_key_j[2])

作業を行いますが、明示的に二回辞書を横断し、forループポッピングが非効率的に感じるために必要な追加
to_remove = [] 
for ilcs, iloads in running_load.items(): 
    for jlcs, jloads in running_load.items(): 
     if iloads[0] > jloads[0] and iloads[1] > jloads[1] and abs(iloads[2]) < abs(jloads[2]): 
      # print(iloads, jloads) 
      to_remove.append(ilcs) 
      break 

for i in to_remove: 
    running_load.pop(i) 

..

があります:

は何私は仕事のために書いたことはこれですもっといい方法?発電機でこれを行うほうが効率的でしょうか。具体的には、any()としましょう。

PS:私のアプローチで別の問題がいくつかの点での値そのものに対してテストされようとしている(とはい1は、そのとcontinueけど...かどうかを確認できる)ので、それは平等のためにテストすることはできませんということです

+0

これらの値に 'load.items()'をソートすれば恩恵を受けるかもしれません。あなたの基準を満たしていないことを知っているリストを見ることは避けてください。 –

+0

良い点ですが、その順序で。私は値をソートできません。しかし、おそらく私は 'ordereddict'を使うことができ、' values [0] 'と言って順序を入れ、現在のキーの前のスライスだけを検索します。 –

+0

どのような順序で値を戻しますか?彼らが進んでいるときに彼らが辞書から出て来るのと同じ順序であるという保証はありません。 –

答えて

0

削除する要素のリストを使用する代わりに、新しい辞書を作成し、保持する要素のみを追加することができます。

最初の段階でO(n^2)の複雑さを減らす方法はありません(すべての要素を他の要素と比較します)。

また、辞書の項目と同じ内容の2つの異なるリスト(それぞれに1つのリスト)を生成すると思います。これは、「他のすべてのアイテムとすべてのアイテムを比較する」と比較して、それほど多くはないはずですが、それでも役立ちます。

0

だから、最初の、おそらく最も明白な解決策に沿って(algo1)私は2番目の1(algo2)のことを書いた:

  • は辞書からのタプルのリストを作成します。
  • これを注文します(したがって、比較を2に減らします)。同じループ内
  • 及びポップ -
  • スライスは(>より大きいN、大きな利点従って^ 2(N^2 + N)/ 2 Nから比較を減らします)。
    def algo1(a_dict): 
        to_remove = [] 
        for ilcs, iloads in a_dict.items(): 
         for jlcs, jloads in a_dict.items(): 
          if iloads[0] > jloads[0] and iloads[1] > jloads[1] and abs(iloads[2]) < abs(jloads[2]): 
           # print(iloads, jloads) 
           to_remove.append(ilcs) 
           break 
        for i in to_remove: 
         a_dict.pop(i) 
        return a_dict 
    
    def algo2(a_dict): 
        ordered_list_view = sorted(a_dict.items(), key=lambda t: abs(t[1][2])) 
        for i, ikv in enumerate(ordered_list_view): 
         forward_slice = ordered_list_view[i:] 
         for j, jkv in enumerate(forward_slice): 
          if all(ikv[1][j] > jkv[1][j] for j in range(2)): 
           print(ikv[1], jkv[1]) 
           a_dict.pop(ikv[0]) 
           break 
        return a_dict 
    

は、私も彼らを時限が、私の驚きに、algo1はまだ速かったです。おそらく..

関連する問題