Python 在一个序列中进行所有双向比较的最有说服力的方法是什么?

Python 在一个序列中进行所有双向比较的最有说服力的方法是什么?,python,Python,在一个序列中进行所有双向比较的最有说服力的方法是什么 到目前为止,我所尝试的: 太可怕了。不进行n^2而不是n/2n-1比较。还将项目与自身进行比较 l = [] for i in xrange(1,len(sequence)): for j in xrange(i-1): l.append(compare(sequence[i], sequence[j])) 丑陋的 这可能是它,但不确定它是否是Pythonic。这里是嵌套for循环示例之一的变体,运行时间:n-1 n

在一个序列中进行所有双向比较的最有说服力的方法是什么

到目前为止,我所尝试的:

太可怕了。不进行n^2而不是n/2n-1比较。还将项目与自身进行比较

l = []
for i in xrange(1,len(sequence)):
    for j in xrange(i-1):
        l.append(compare(sequence[i], sequence[j]))
丑陋的


这可能是它,但不确定它是否是Pythonic。

这里是嵌套for循环示例之一的变体,运行时间:n-1 n/2,使用:

哪些产出:

1 ~ 2
1 ~ 4
1 ~ 8
1 ~ 16
1 ~ 32
1 ~ 64
2 ~ 4
2 ~ 8
2 ~ 16
2 ~ 32
2 ~ 64
4 ~ 8
4 ~ 16
4 ~ 32
4 ~ 64
8 ~ 16
8 ~ 32
8 ~ 64
16 ~ 32
16 ~ 64
32 ~ 64
使用,它可以写得更短:

import itertools

# ...

for a, b in itertools.combinations(seq, 2):
    compare(a, b)

下面是嵌套for循环的一个示例的变体,运行时间:n-1 n/2,使用:

哪些产出:

1 ~ 2
1 ~ 4
1 ~ 8
1 ~ 16
1 ~ 32
1 ~ 64
2 ~ 4
2 ~ 8
2 ~ 16
2 ~ 32
2 ~ 64
4 ~ 8
4 ~ 16
4 ~ 32
4 ~ 64
8 ~ 16
8 ~ 32
8 ~ 64
16 ~ 32
16 ~ 64
32 ~ 64
使用,它可以写得更短:

import itertools

# ...

for a, b in itertools.combinations(seq, 2):
    compare(a, b)
那么:

[compare(seq[k], i) for k in range(len(seq)) for i in seq[k+1:]]
这与您的第二个代码片段遵循相同的比较模式。

如何:

[compare(seq[k], i) for k in range(len(seq)) for i in seq[k+1:]]

这与您的第二个代码片段遵循相同的比较模式。

排列为您提供了所有可能的排序,因此n^2-1个结果。如果顺序不相关,请尝试组合精子置换将提供所有可能的顺序,因此n^2-1结果。如果顺序不相关,请尝试combinations@miku:打得好,我在示例中切换了双向匹配和单向匹配。组合,而不是排列。@miku:好主意,在我的例子中,我在双向匹配和单向匹配之间切换。组合,而不是排列。