2016-12-26 21 views
0
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() 

那麼,什麼我的代碼是應該做的是安排在一個N×N的矩陣,它是如何工作的字典的信息是,「原產地」和「目的地」是「邊界」在martix的重複第二如果條件使用或

enter image description here

那麼,如果讓我們說我可以從「起源」去在同一字典陳述「目的地」,將它添加到下右側的矩陣(X ,Y)的矩陣 一個例子是,在第一個字典中我可以從「Origin 001」到「Destination 002」,所以我會把字典的值放在u的nDer X,Y(001,002)的矩陣 我的問題是在我使用內部的兩個forif條件與or代碼的最後一部分循環

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

輸出必須是一個絕對矩陣(列表清單)?或者它可以是另一個模仿它的結構,就像是一個字典詞典? –

+0

不,字典的字典可以很好地適用,但請記住,如果沒有從「起源」到「目的地」的旅行,(X,Y)應該顯示無 – Enigma

回答

1

@Enigma:這裏是與類型的字典作爲輸出的一個字典的溶液:

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) + "||" 
相關問題