从列表中的距离排序的列表中获取对的最快方法

时间:2014-12-02 12:09:01

标签: python algorithm sorting permutation

给定range(n)从列表中各自的距离排序的最快方式是从列表中获取对,即列表A和{{1}中的两个元素距离为B。 这是我提出的实现:

abs(A-B)

但我希望它能成为一名发电机并提高效率。

2 个答案:

答案 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))