使用或重复第二个If条件

时间:2016-12-26 16:52:59

标签: python loops dictionary if-statement

main_dict=
{1: {'Origin': '001', 'Destination': '002', 'Cost': '0100.00','Time': '04.00'}, 
 2: {'Origin': '002', 'Destination': '003', 'Cost': '0500.00', 'Time': '01.50'}, 
 3: {'Origin': '003', 'Destination': '004', 'Cost': '0200.00', 'Time': '11.40'}, 
 4: {'Origin': '002', 'Destination': '004', 'Cost': '0700.00', 'Time': '10.00'}, 
 5: {'Origin': '004', 'Destination': '006', 'Cost': '0550.00', 'Time': '06.75'}, 
 6: {'Origin': '004', 'Destination': '005', 'Cost': '0750.00', 'Time': '10.50'}, 
 7: {'Origin': '005', 'Destination': '006', 'Cost': '0460.00', 'Time': '08.00'}, 
 8: {'Origin': '002', 'Destination': '005', 'Cost': '1500.00', 'Time': '05.75'}}
count=9
first_list=[]                   
second_list=[]
for c in range(1,count):            
    first_list.append(main_dict[c]['Origin'])   #puts all origins in one list
    second_list.append(main_dict[c]['Destination'])#puts all destinations iin one list
locations=[]
locations.extend(first_list)
locations.extend(second_list)
locations=(list(set(locations)))#gets rid of any duplicates
locations.sort()
mat_nxn = [[None for x in range(len(locations))] for y in range(len(locations))] #in this section the main matrix is created 
for i in range(len(locations)):
    mat_nxn[0][i]=locations[i] #fills the first row with the locations
    mat_nxn[i][0]=locations[i] #fills the first column with the locations

for n in range(0,len(locations)-1):
    for i in range(0,len(locations)):
         if str(mat_nxn[0][n])==main_dict[n+1]['Origin'] or str(mat_nxn[i][0])==main_dict[i+1]['Destination'] :
            a=int(mat_nxn[0][n])
            b=int(mat_nxn[n][0])
            mat_nxn[b][a]=main_dict[n+1].values()

所以我的代码应该做的是将字典的信息排列在NxN矩阵中,它的工作原理是“Origin”和“Destination”是martix的“边界”

enter image description here

然后,如果让我们说我可以从“Origin”转到“目的地”,如同SAME字典中所述,它将被添加到矩阵右边(X,Y)下的矩阵 一个例子是,在第一个字典中我可以从“Origin 001”到“Destination 002”,所以我将字典的值放在X,Y(001,002)下面的矩阵中 我的问题出在代码的最后一部分,我在if个循环中使用了or条件和for

for n in range(0,len(locations)-1):
   for i in range(0,len(locations)):
     if str(mat_nxn[0][n])==main_dict[n+1]['Origin'] or str(mat_nxn[i][0])==main_dict[i+1]['Destination'] :

现在的问题是,如果我有一个重复的“Origin”在我的情况下它是002 它将不会检查其余的“Destinations”,只检查第一个,所以我的输出不能完成。我怎样才能检查所有这些?我是否以错误的方式使用or? 非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

@Enigma:这是一个解决方案,其中有一个dicts字典作为输出:

import sys

main_dict = {
    1: {'Origin': '001', 'Destination': '002', 'Cost': '0100.00', 'Time': '04.00'}, 
    2: {'Origin': '002', 'Destination': '003', 'Cost': '0500.00', 'Time': '01.50'},
    3: {'Origin': '003', 'Destination': '004', 'Cost': '0200.00', 'Time': '11.40'}, 
    4: {'Origin': '002', 'Destination': '004', 'Cost': '0700.00', 'Time': '10.00'}, 
    5: {'Origin': '004', 'Destination': '006', 'Cost': '0550.00', 'Time': '06.75'}, 
    6: {'Origin': '004', 'Destination': '005', 'Cost': '0750.00', 'Time': '10.50'}, 
    7: {'Origin': '005', 'Destination': '006', 'Cost': '0460.00', 'Time': '08.00'}, 
    8: {'Origin': '002', 'Destination': '005', 'Cost': '1500.00', 'Time': '05.75'}
}

locations = {}

origins = set([x['Origin'] for x in main_dict.values()])
destinations = set([x['Destination'] for x in main_dict.values()])

_min = min(origins) if min(origins) < min(destinations) else min(destinations)
_max = max(origins) if max(origins) > max(destinations) else max(destinations)

for origin in origins:
    for destination in destinations:
        if origin not in locations.keys():
            locations[origin] = {}
        if destination not in locations[origin].keys():
            locations[origin][destination] = None

for travel in main_dict.values():
    locations[travel['Origin']][travel['Destination']] = (
        int(travel['Origin']), 
        int(travel['Destination']),
        float(travel['Cost']), 
        float(travel['Time'])
    )

解决方案的代表:

# ||====================================================================================================================================================================================||
# ||          Data          ||          001           ||          002           ||          003           ||          004           ||          005           ||          006           ||
# ||====================================================================================================================================================================================||
# ||          001           ||          None          ||   (1, 2, 100.0, 4.0)   ||          None          ||          None          ||          None          ||          None          ||
# ||          002           ||          None          ||          None          ||   (2, 3, 500.0, 1.5)   ||  (2, 4, 700.0, 10.0)   ||  (2, 5, 1500.0, 5.75)  ||          None          ||
# ||          003           ||          None          ||          None          ||          None          ||  (3, 4, 200.0, 11.4)   ||          None          ||          None          ||
# ||          004           ||          None          ||          None          ||          None          ||          None          ||  (4, 5, 750.0, 10.5)   ||  (4, 6, 550.0, 6.75)   ||
# ||          005           ||          None          ||          None          ||          None          ||          None          ||          None          ||   (5, 6, 460.0, 8.0)   ||
# ||          006           ||          None          ||          None          ||          None          ||          None          ||          None          ||          None          ||
# ||====================================================================================================================================================================================||

用于重现该输出的讨厌的代码:

def draw():
    _template = '||{: ^24}'
    _range = range(int(_min), int(_max) + 1)
    print("||" + "=" * (26 * (len(_range) + 1) -2) + "||")
    print("||          Data          {}||".format("".join([_template.format(str(x).zfill(3)) for x in _range])))
    print("||" + "=" * (26 * (len(_range) + 1) -2) + "||")
    for origin in _range:
        _origin = str(origin).zfill(3)
        line = _template.format(_origin)    
        for destination in _range:
            #print(_origin, _destination)
            try:
                _destination = str(destination).zfill(3)
                value = locations[_origin][_destination]
                #print(_origin, _destination)
                #print("value",value)
                line += _template.format(str(value))
            except KeyError:
                #print("Error")
                #print(_origin, _destination)
                line += _template.format("None")
        line += '||'
        print(line)
    print("||" + "=" * (26 * (len(_range) + 1) -2) + "||"