python 中的双增量循环

Double increment loop in python

我有一个简短的(可能非常微不足道的)问题要问你们大多数人。我正在尝试使用一个循环来递增两个变量,这样我就可以生成一个热图,以简单的形式显示文件的相似性。

我的想法是,如果我有 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 和 2、1 和 3 以及 2 和 3。显然,对于几个文件的简短列表,这还算不错,但是对于一百个文件,它会显着增加计算量。这将使我能够显着加快比较速度,特别是因为我正在比较的文件通常非常大(每个大约 500K 行)。

如果有任何建议,我将不胜感激。

你可以像这样使用第一个循环的值作为第二个循环范围的起始值

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):

不要重新发明轮子。如果您需要组合,只需使用 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 循环相比,这更具可读性(代码准确地告诉您它做了什么)并且不太容易引入愚蠢的差一错误等。此外,这同样适用于 any 类型的集合或可迭代对象,而不仅仅是有序的数字列表。