Python can';t在循环中设置正确的索引
X索引不是代码的一部分,因为它是导致问题的原因,我找不到一个正确的方法来索引它 代码的目的是从Python can';t在循环中设置正确的索引,python,loops,indexing,Python,Loops,Indexing,X索引不是代码的一部分,因为它是导致问题的原因,我找不到一个正确的方法来索引它 代码的目的是从s_dict获取“请求”,并将其与main_dict的行程信息相匹配。在s_dict[0]中,客户希望从起点'2'到目的地'5',成本为0,这意味着价格不重要,时间相同,站点为99,这也意味着不管有多少站点。 现在我应该找到从“2”到“5”的所有可用路径,并返回每个路径花费/消耗的时间 密令={ 1:{'Origin':'002','Destination':'005','Cost':'0000.00'
s_dict
获取“请求”,并将其与main_dict
的行程信息相匹配。在s_dict[0]
中,客户希望从起点
'2'到目的地
'5',成本
为0,这意味着价格不重要,时间相同,站点
为99,这也意味着不管有多少站点。
现在我应该找到从“2”到“5”的所有可用路径,并返回每个路径花费/消耗的时间
密令={
1:{'Origin':'002','Destination':'005','Cost':'0000.00','Stops':'99','Time':'00.00'}
2:{'Origin':'002','Destination':'005','Cost':'0000.00','Stops':'11','Time':'00.00'}
3:{'Origin':'002','Destination':'005','Cost':'1450.11','Stops':'99','Time':'00.00'}
4:{'Origin':'004','Destination':'005','Cost':'1550.11','Stops':'99','Time':'22.22'}
5:{'Origin':'001','Destination':'005','Cost':'0000.00','Stops':'99','Time':'11.00'}
主语=
{1:{'Origin':'001','Destination':'002','Cost':'0100.00','Time':'04.00'}
2:{'Origin':'002','Destination':'003','Cost':'0500.00','Time':'01.50'}
3:{'Origin':'002','Destination':'004','Cost':'0700.00','Time':'10.00'}
4:{'Origin':'002','Destination':'005','Cost':'1500.00','Time':'05.75'}
5:{'Origin':'003','Destination':'004','Cost':'0200.00','Time':'11.40'}
6:{'Origin':'004','Destination':'005','Cost':'0750.00','Time':'10.50'}
7:{'Origin':'004','Destination':'006','Cost':'0550.00','Time':'06.75'}
从main_dict
中,我取出了信息,因为这样对我来说使用它更容易,并且使sec
秒=[
[1,2,4.0,100.0],
[2,3,1.5500.0],
[2,4,10.0700.0],
[2,5,5.75,1500.0],
[3,4,11.4200.0],
[4,5,10.5750.0],
[4,6,6.75550.0]]
全路径=[
[2,3,4,5],[2,4,5],[2,5]
[4,5]]
[1,2,3,4,5],[1,2,4,5],[1,2,5]]
all_路径
来自s_目录
在前三种情况下,它有两个特定的值,即2->5,这意味着我想从起点2到目的地5,我应该显示所有可用的路线,这意味着2->3->4->5,2->4->5,2->5
这就是路径,现在我正在努力计算每次旅行的费用。
换句话说,如果我们取2->4->5,那么在s_dict中,它将取2作为起点,3作为终点,计算出成本
变量中的成本值,然后取3作为起点,4作为终点,并将成本值与成本
变量相加。
这里我的问题是索引如果sec[trips][0]==(所有路径[tin-1][n][X])或sec[trips][1]==(所有路径[tin-1][n][X]):
问题主要是如何索引X“X不是代码的一部分”
我已经尝试了很多方法来解决这个问题,但都不起作用,我得到的最好的结果是改变目的地,一直保持相同的原点,所以2->3+2->4+2->5而不是2->3+3->4+4->5的成本,如果我正确理解了代码,这里基本上需要的是某种函数 基本上:
for rout in range(1,6):
print 'From: '+str(int(s_dict[rout]['Origin']))+','+' to: '+str(int((s_dict[rout]['Destination'])))+','+' Stops: '+(s_dict[rout]['Stops'])+','+' Cost: '+(s_dict[rout]['Cost'])+','+' Time: '+(s_dict[rout]['Time'])
print 'All routes:'
for n in range(len(all_path[rout-1])):
all_routs=''
for s in range(len(all_path[rout-1][n])):
all_routs+= str(all_path[rout-1][n][s])
stops=str(len(all_routs)-2)
cost=0
for trips in range(len(sec)):
if sec[trips][X]==(all_path[rout-1][n][0]) or sec[trips][X]==(all_path[rout-1][n][1]):
cost+=sec[trips][3]
print '->'.join(all_routs)+', Stops: '+stops+', Cost: '+str(cost)
您只向我们提供了['OUTPUT']
和['PROCESS']
的缩短版本。但是我们必须知道['INPUT']
是什么,以及['PROCESS']
试图做什么。否则,没有足够的信息来回答您的问题 一个好的开始是陈述一种情况: 我正在为类似导航应用程序的东西设计一个路径查找算法。我使用一个网格地图,将成本作为距离 在顶点之间。这是我的成本函数: //代码// 有没有办法优化它
经过长时间的反复评论,我不认为这可以回答你的具体问题。我的假设是,当您到达
all\u path
时,您已经解决了costs=99
的问题。在这种情况下,我认为您应该将代码重构为如下内容,以摆脱您所处的索引地狱。它绝不是完美的精炼,但希望更容易遵循
def path_finding_algorithm('[INPUT]'):
//loads of processing here
//
// '[PROCESS]'
//
return '[OUTPUT]'
假设您的main_dict
的数据结构准确,您可以使用以下内容构建一个真正的成本字典:
import random
import itertools
###### Generate some fake data for our dict ######
# First get all of our location pairings as tuples
loc_pairs = list(itertools.product(range(1, 6), range(1, 6)))
# Build cost dictionary. Tuple key is (from-location, to-location)
cost_dict = {}
for loc_pair in loc_pairs:
cost_dict[loc_pair] = {'cost': random.randint(0, 50),
'time': random.randint(0, 50)}
##### Now your data for paths ######
all_path=[[[2, 3, 4, 5], [2, 4, 5], [2, 5]], [[4, 5]], [[1, 2, 3, 4, 5],
[1, 2, 4, 5], [1, 2, 5]]]
### Build the printout
for start_location in all_path:
for route in start_location:
locations_visited = ' -> '.join(str(item) for item in route)
costs = 0
times = 0
try:
for x in range(len(route)-1):
costs += cost_dict[(route[x], route[x+1])]['cost']
times += cost_dict[(route[x], route[x+1])]['time']
print("The route: {}".format(locations_visited))
print("costs: {}".format(costs))
print("took: {}".format(times))
except:
pass
我似乎无法计算出我们需要的
sec
数据。实际上,我已经阅读了3次,每次都会感到更加困惑。至少在我的例子中,如果你把这段文字分解,使它更具体,会容易得多。例如,我猜sec
有类似于[起点、终点、某物、某物]
的东西,但这将上升到6
,但您最多只有5个指定位置。然后我们有s_dict
,它只有5
作为目的地和99个“站点”。似乎没有任何东西与另一个相关,我无法从代码中获得它,因为这是错误的。我同意@roganjosh,代码很难阅读。另外,您使用的是什么版本的python?一般来说,请说明一个问题。我们不知道什么是tin,一般来说,一切都不容易理解。这是一个很长的代码,tin只是一个索引,不是一个特别有用的响应。我们可以看到,tin
是一个索引,但实际上我们必须将您试图做的事情可视化<代码>tin
对我们来说没有意义,所以当你有大量嵌套的循环并且没有基础去理解发生了什么时,它只是
real_costs = {1: {'Origin': '001', 'Destination': '002', 'Cost': '0100.00', 'Time': '04.00'},
2: {'Origin': '002', 'Destination': '003', 'Cost': '0500.00', 'Time': '01.50'},
3: {'Origin': '002', 'Destination': '004', 'Cost': '0700.00', 'Time': '10.00'},
4: {'Origin': '002', 'Destination': '005', 'Cost': '1500.00', 'Time': '05.75'},
5: {'Origin': '003', 'Destination': '004', 'Cost': '0200.00', 'Time': '11.40'},
6: {'Origin': '004', 'Destination': '005', 'Cost': '0750.00', 'Time': '10.50'},
7: {'Origin': '004', 'Destination': '006', 'Cost': '0550.00', 'Time': '06.75'}}
real_cost_dict = {}
for key, value in real_costs.items():
pairing = (value.get('Origin'), value.get('Destination'))
real_cost_dict[pairing] = {'cost': value.get('Cost'),
'time': value.get('Time')}