在序列中进行所有双向比较的最Pythonic方法是什么?
到目前为止我尝试了什么:
[compare(i, j) for i in sequence for j in sequence]
可怕。是n ^ 2而不是n / 2(n-1)比较。同时将项目与自身进行比较。
l = []
for i in xrange(1,len(sequence)):
for j in xrange(i-1):
l.append(compare(sequence[i], sequence[j]))
难看。
[compare(i, j) for i, j in permuations(sequence, 2)]
这可能是它,但不确定它是否是Pythonic。
答案 0 :(得分:4)
以下是使用enumerate的一个示例(嵌套 for 循环,运行时间:(n - 1)n / 2 )的变体:
seq = (1, 2, 4, 8, 16, 32, 64)
def compare(a, b):
print('%s ~ %s' % (a, b))
if __name__ == '__main__':
for i, item in enumerate(seq, start=1):
for other in seq[i:]:
compare(item, other)
哪个输出:
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
使用itertools,可以写得更短:
import itertools
# ...
for a, b in itertools.combinations(seq, 2):
compare(a, b)
答案 1 :(得分:0)
怎么样:
[compare(seq[k], i) for k in range(len(seq)) for i in seq[k+1:]]
这与第二个片段的比较模式相同。