对于大多数人来说,我有一个快速(可能非常微不足道)的问题。我试图使用一个循环来增加两个变量,这样我就可以生成一个热图图,它将以简单的形式显示文件的相似性。
我的想法是,如果我有100个文件,我想将它们彼此进行比较。目前我重复我的比较(即比较文件1和2,然后比较文件2和1),这是非常低效的。我当前删除的脚本如下所示:
for fileX in range(1,4):
for fileY in range(1,4):
print "X is " + str(fileX) + ", Y is " + str(fileY)
我获得的输出是这样的:
X is 1, Y is 1
X is 1, Y is 2
X is 1, Y is 3
X is 2, Y is 1
X is 2, Y is 2
X is 2, Y is 3
X is 3, Y is 1
X is 3, Y is 2
X is 3, Y is 3
而我正在寻找的是这样的:
X is 1, Y is 1 << not necessary since it is always 100 %
X is 1, Y is 2
X is 1, Y is 3
X is 2, Y is 2 << not necessary since it is always 100 %
X is 2, Y is 3
X is 3, Y is 3 << not necessary since it is always 100 %
原因是,我已经比较过文件1&amp; 2,1&amp; 3和2&amp;在上一次迭代中为3。显然,对于几个文件的简短列表,这并不是太糟糕,但是对于一百个文件,它会显着增加计算量。这将使我能够非常显着地加快比较,特别是因为我比较的文件通常非常大(每个约500K行)。
我将不胜感激任何建议。
答案 0 :(得分:6)
您可以使用第一个循环的值作为第二个循环范围的起始值,如
for fileX in range(1,4):
for fileY in range(fileX,4):
也要跳过那些
for fileX in range(1,4):
for fileY in range(fileX+1,4):
答案 1 :(得分:2)
不要重新发明轮子。如果您需要组合,只需使用itertools.combinations
:
for fileX, fileY in itertools.combinations(range(1,4), 2):
print "X is " + str(fileX) + ", Y is " + str(fileY)
输出:
X is 1, Y is 2
X is 1, Y is 3
X is 2, Y is 3
与double-for-loop相比,它更具可读性(代码完全告诉你它的作用),并且不太容易引入愚蠢的逐个错误等。此外,这适用于任何类型的集合或可迭代,而不仅仅是有序的数字列表。