修复 Python 中的 4 个嵌套 for 循环
Fixing a 4 nested for loops in Python
所以我正在尝试实施凝聚聚类算法并检查每个集群之间的距离我使用这个:
a, b = None, None
c = max
for i in range(len(map)-1):
for n in range(len(map[i])):
for j in range(i+1, len(map)):
for m in range(len(map[j])):
//dist is distance func.
d = dist(map[i][n], map[j][m])
if c > d:
a, b, c = i, j, d
print(a, ' ', b)
return a, b
地图看起来像这样:{ 0: [[1,2,3], [2,2,2]], 1: [[3,3,3]], 2: [[4,4 ,4], [5,5,5]] }
我期望的是每个行项目与其他每一行的每个 row/col 进行比较。所以像这样:
比较:
[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 而失败。
我怀疑问题出在此处或合并集群中。
如果 map
是 dict
个值,则您的索引存在一般性问题:
for m in range(len(map[j])):
您使用 range()
创建数字索引。但是,在此示例中,您需要 j
是字典 map
的有效键。
编辑:
那是 - 当然 - 假设您没有使用基于 0 的递增整数作为 map
的键,在这种情况下您可能还使用了 list
。通常,您似乎依赖 list
或 OrderedDict
中提供的顺序(或 Python3.6+ 中的 dict
作为实现细节)。以 for j in range(i+1, len(map)):
为例。因此我建议使用 list
.
编辑 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
在访问地图[j]之前检查它是否有效:
if j in map.keys():
#whatever
或者放在try/except:
try:
#...
except KeyError:
#....
编辑:
最好像这样使用 for 循环:
for i in map.keys():
#.....
所以我正在尝试实施凝聚聚类算法并检查每个集群之间的距离我使用这个:
a, b = None, None
c = max
for i in range(len(map)-1):
for n in range(len(map[i])):
for j in range(i+1, len(map)):
for m in range(len(map[j])):
//dist is distance func.
d = dist(map[i][n], map[j][m])
if c > d:
a, b, c = i, j, d
print(a, ' ', b)
return a, b
地图看起来像这样:{ 0: [[1,2,3], [2,2,2]], 1: [[3,3,3]], 2: [[4,4 ,4], [5,5,5]] }
我期望的是每个行项目与其他每一行的每个 row/col 进行比较。所以像这样:
比较: [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 而失败。
我怀疑问题出在此处或合并集群中。
如果 map
是 dict
个值,则您的索引存在一般性问题:
for m in range(len(map[j])):
您使用 range()
创建数字索引。但是,在此示例中,您需要 j
是字典 map
的有效键。
编辑:
那是 - 当然 - 假设您没有使用基于 0 的递增整数作为 map
的键,在这种情况下您可能还使用了 list
。通常,您似乎依赖 list
或 OrderedDict
中提供的顺序(或 Python3.6+ 中的 dict
作为实现细节)。以 for j in range(i+1, len(map)):
为例。因此我建议使用 list
.
编辑 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
在访问地图[j]之前检查它是否有效:
if j in map.keys():
#whatever
或者放在try/except:
try:
#...
except KeyError:
#....
编辑: 最好像这样使用 for 循环:
for i in map.keys():
#.....