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 can';t在循环中设置正确的索引_Python_Loops_Indexing - Fatal编程技术网

Python can';t在循环中设置正确的索引

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'

X索引不是代码的一部分,因为它是导致问题的原因,我找不到一个正确的方法来索引它

代码的目的是从
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')}