Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中列表中的最短路径_Python - Fatal编程技术网

Python中列表中的最短路径

Python中列表中的最短路径,python,Python,假设我有如下列表: a = [0,1,2,3,4,5,6,7,8,9] 假设我有以下选择路径的要求: starting_index = 3 ending_index = 7 这意味着获得从3到7开始的项目,结果是: first_path = [3,4,5,6,7] 假设这是一个循环列表,该路径也可以是: second_path = [7,8,9,0,1,2,3] 在这种情况下,以下方法可以解决问题(最短路径): 但对于以下要求: starting_index = 1 ending_ind

假设我有如下列表:

a = [0,1,2,3,4,5,6,7,8,9]
假设我有以下选择路径的要求:

starting_index = 3
ending_index = 7
这意味着获得从3到7开始的项目,结果是:

first_path = [3,4,5,6,7]
假设这是一个循环列表,该路径也可以是:

second_path = [7,8,9,0,1,2,3]
在这种情况下,以下方法可以解决问题(最短路径):

但对于以下要求:

starting_index = 1
ending_index = 8
从指数1到8的结果:

first_path = [1,2,3,4,5,6,7,8]
但另一方面:

second_path = [8,9,0,1]
因此,在这种情况下:

shortest_path = a[1:8]
这并不能解决问题。 如何使这个问题自动化? 谢谢

或者更简洁地说:

sp = a[s_ind:e_ind+1] if len(a) - e_ind + s_ind > e_ind - s_ind else a[e_ind:] + a[:s_ind+1]
例如:

>>> s_ind, e_ind = 3, 7
>>> sp
[3, 4, 5, 6, 7]

s_ind, e_ind = 1, 8
>>> sp
[8, 9, 0, 1]

您可以使用内置的
slice
方法,并且
slice
s具有可比性,因此您可以对它们使用
min

shortest_path = (a+a)[min(slice(start, end+1), slice(end, len(a)+start+1))]
这相当于:

start_to_end = slice(start, end+1)
end_to_start = slice(end, len(a)+start+1)

if start_to_end > end_to_start:
    shortest_path = (a+a)[start_to_end]
else:
    shortest_path = (a+a)[end_to_start]
shortest_path = (a+a)[min(slice(start, end+1), slice(end, len(a)+start+1))]
start_to_end = slice(start, end+1)
end_to_start = slice(end, len(a)+start+1)

if start_to_end > end_to_start:
    shortest_path = (a+a)[start_to_end]
else:
    shortest_path = (a+a)[end_to_start]