圆形列表中两个元素之间的最小距离?

时间:2015-06-27 21:07:16

标签: python list cycle circular-list

假设我有一个这样的列表:

my_list = [A, B, C, D, E, F, G]

实际上,我使用我的列表就像一个循环。这意味着在G A之后A之前,G之前就有B

我想知道最短的距离是什么,例如F3

显然,答案是F -> G -> A -> B,因为B -> C -> D -> E -> Fdef distance(len_my_list, idx_1, idx_2): right = max(idx_1, idx_2) left = min(idx_1, idx_2) dist_1 = right - left dist_2 = (len_my_list - right) + left return min(dist_1, dist_2) 短。

计算这种距离的“pythonic”方法是什么?

到目前为止,我觉得非常难看(假设我知道索引):

#include

2 个答案:

答案 0 :(得分:6)

由于您将列表视为循环,因此可以使用模运算来查找两个距离。

您只需要计算第一个索引减去第二个索引(以列表的长度为模),第二个索引减去第一个索引(以列表的长度为模)。最短路径是两个值中的最小值。

在Python代码中,保留变量名称:

def distance(len_my_list, idx_1, idx_2):
    i = (idx_1 - idx_2) % len_my_list
    j = (idx_2 - idx_1) % len_my_list
    return min(i, j)

对于您的示例,i为3,j为4.因此函数返回3.

答案 1 :(得分:1)

接受的答案依赖于对与除数相同符号的答案取模。在Python中确实如此,但并非所有语言都如此。 (请参阅:https://en.wikipedia.org/wiki/Modulo_operation#In_programming_languages

以下代码是特定于语言的:

def distance(len_my_list, idx_1, idx_2):
    dist = abs(idx_1 - idx_2)
    return min(len_my_list - dist, dist)