Del*_*gan 3 python list cycle circular-list
假设我有一个这样的列表:
my_list = [A, B, C, D, E, F, G]
Run Code Online (Sandbox Code Playgroud)
实际上,我使用我的列表就像一个循环.这意味着在G有之后A,之前A有之G.
我想知道例如B和之间的最短距离是多少F.
显然,答案是3因为F -> G -> A -> B比短B -> C -> D -> E -> F.
计算这种距离的"pythonic"方法是什么?
到目前为止,我觉得非常难看(假设我知道索引):
def 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)
Run Code Online (Sandbox Code Playgroud)
接受的答案依赖于模返回与除数相同符号的答案。这适用于 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)
Run Code Online (Sandbox Code Playgroud)
由于您将列表视为循环,因此可以使用模运算来查找两个距离.
您只需计算第一个索引减去第二个索引(以列表的长度为模),第二个索引减去第一个索引(以列表的长度为模).最短路径是两个值中的最小值.
在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)
Run Code Online (Sandbox Code Playgroud)
对于您的示例,i是3并且j是4.因此该函数返回3.