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 类型的集合或可迭代对象,而不仅仅是有序的数字列表。
我有一个简短的(可能非常微不足道的)问题要问你们大多数人。我正在尝试使用一个循环来递增两个变量,这样我就可以生成一个热图,以简单的形式显示文件的相似性。
我的想法是,如果我有 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 类型的集合或可迭代对象,而不仅仅是有序的数字列表。