给定range(n)
从列表中各自的距离排序的最快方式是从列表中获取对,即列表A
和{{1}中的两个元素距离为B
。
这是我提出的实现:
abs(A-B)
但我希望它能成为一名发电机并提高效率。
答案 0 :(得分:2)
如果你想要一个发电机:
def distant_pairs(n):
for d in range(n, 0, -1):
for i in range(n-d):
yield (i, i+d)
或者散文:对于每个可能的距离,从最大到最小,找到距离相隔的每一对并产生它。
这是一个小型测试工具,可以显示它的工作原理:
for n in range(12):
answer = list(distant_pairs(n))
prev_answer = sorted(combinations(range(n), 2), key=lambda a: -abs(a[0]-a[1]))
print "SIZE", n
print answer
print prev_answer
assert answer == prev_answer
print "---"
print "done"
答案 1 :(得分:1)
距离外循环可行:
((a, a + d) for d in range(1, n) for a in range(n - d))