2017-07-15 1 views
1

にループのネストされた4の固定します[1,2,3]、[2,2,2]]、1:[[3,3,3]]、2:[[4,4,4]、[5,5,5]]は、だから私は、凝集クラスタリングアルゴリズムを実装するために、私はこれを使用し、各クラスタ間の距離をチェックしようとしているのPython

私が期待するのは、各行項目が他のすべての行のすべての行/列と比較されることです。したがって、このようなもの:

比較: [1,2,3]および[3,3,3]、[1,2,3]および[4,4,4]、[1,2,3 ]と[5,5,5]、[2,2,2]、[3,3,3]など

これを実行すると、1回だけ動作し、6 KeyErrorを使用します。
問題がここにあるか、クラスタをマージしていると思われます。

+0

'map'はどうなっていますか? –

+0

'map'はPythonの予約語ですので、' max' – alfasin

+1

'//これはコメントではありませんが、'#これはコメントです ' – alfasin

答えて

1

mapは値のdictである場合、あなたはあなたのインデックスの一般的な問題があります:あなたは、数値インデックスを作成するためにrange()を使用

for m in range(len(map[j])):

を。ただし、jがこの例に必要なのは、辞書mapの有効なキーです。

EDIT: ある - もちろん - あなたはあなたにもlistで行っている可能性が発生したmapのキーとして0ベースのインクリメント整数を、使用しなかったと仮定。一般的には、listまたはOrderedDict(またはPython3.6のdict)で提供されている順序に依存しているようです。良い例としてfor j in range(i+1, len(map)):を参照してください。したがって、私はlistを使用することをお勧めします。

EDIT 2:また、map.keys()のリストを作成して、インデックスmapにそれを使用します。マップするためにアクセスする前に

a, b = None, None 
c = max 
keys = list(map.keys()) 
for i in range(len(map)-1): 
    for n in range(len(map[keys[i]])): 
     for j in range(i+1, len(map)): 
      for m in range(len(map[keys[j]])): 
       #dist is distance func. 
       d = dist(map[keys[i]][n], map[keys[j]][m]) 
       if c > d: 
        a, b, c = i, j, d 
print(a, ' ', b) 
return a, b 
0

[j]がチェックはそれが有効であるか好きではない:

if j in map.keys(): 
    #whatever 

または除いて/試しにそれを置く:

try: 
    #... 
except KeyError: 
    #.... 

編集: このようなループの方が良いでしょう:

+0

私はそれを試しました。問題はnまで移動する。 –

+0

ですので、map [i]をにチェックする必要があります。通常、キーで辞書にアクセスしたいときは、そのキーが存在するかどうか、またはtry/exceptに置く必要があります。 – pooya

関連する問題