循环列表的两个元素之间的最小距离?
Minimum distance between two elements of a circular list?
假设我有这样一个列表:
my_list = [A, B, C, D, E, F, G]
实际上,我像循环一样使用我的列表。也就是说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)
由于您将列表视为循环列表,因此您可以使用模运算来找到两个距离。
您只需计算第一个索引减去第二个索引(对列表长度取模),然后计算第二个索引减去第一个索引(对列表长度取模)。最短路径是两个值中的最小值。
在 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。因此函数 returns 3.
接受的答案依赖于模返回与除数符号相同的答案。这在 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)
假设我有这样一个列表:
my_list = [A, B, C, D, E, F, G]
实际上,我像循环一样使用我的列表。也就是说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)
由于您将列表视为循环列表,因此您可以使用模运算来找到两个距离。
您只需计算第一个索引减去第二个索引(对列表长度取模),然后计算第二个索引减去第一个索引(对列表长度取模)。最短路径是两个值中的最小值。
在 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。因此函数 returns 3.
接受的答案依赖于模返回与除数符号相同的答案。这在 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)