python

时间:2015-10-12 14:28:59

标签: python loops iteration ipython

对于大多数人来说,我有一个快速(可能非常微不足道)的问题。我试图使用一个循环来增加两个变量,这样我就可以生成一个热图图,它将以简单的形式显示文件的相似性。

我的想法是,如果我有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行)。

我将不胜感激任何建议。

2 个答案:

答案 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相比,它更具可读性(代码完全告诉你它的作用),并且不太容易引入愚蠢的逐个错误等。此外,这适用于任何类型的集合或可迭代,而不仅仅是有序的数字列表。