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的“边界”
然后,如果让我们说我可以从“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
?
非常感谢任何帮助
答案 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) + "||"