2016-12-26 5 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() 

だから私のコードは辞書の情報をNxNマトリックスに配置することです。どのように動作するかは "Origin"と "Destination"が "border" martixの2番目のIf条件を使用するか、または

enter image description hereその後

、私たちは私が同じ辞書で述べたように「宛先」に「起源」から行くことができるとしましょう、それは右下の行列(Xにそれを追加される場合、Y)行列 の例は、最初の辞書では「Origin 001」から「Destination 002」に行くことができるので、辞書の値u NDERマトリックス中X、Y(001002) 私の問題は、私はorfor 2内部ループ

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'] : 

if条件を使用するコードの最後の部分に今問題があれば、私は重複していることです"Origin" 私の場合は002です。残りの "Destinations"はチェックされず、最初のものだけが出力されますので、私の出力は完了できません。どうすればそれらをチェックすることができますか?私はorを間違った方法で使用しましたか? は、任意のヘルプ

+0

出力絶対行列(リストのリスト)でなければならないのでしょうか?それとも、それを模倣する別の構造ですか? –

+0

いいえ、dictsのdictsはうまくいきますが、 "Origin"から "Destination"への移動がなければ(X、Y)はNoneを表示しなければならないことに留意してください – Enigma

答えて

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) + "||" 
関連する問題