2017-02-22 65 views
1

我希望做一個「旅遊」總之,看起來像:存儲不同類型 - 字典

有出發點,以達到芝加哥。要訪問此 城市,您可以使用:Highway X,Highway Z, Highway ZZ。

,我目前擁有的數據看起來類似:

公路X,紐約,芝加哥

公路Z,洛杉磯,芝加哥

公路X,奧斯汀,芝加哥

ZZ高速公路芝加哥邁阿密

我的問題:我應該用什麼來正確存儲這些數據?

我試着用一個帶有列表的字典。然而,它不起作用,因爲我無法存儲公路名單。我只設法得到類似

{芝加哥:紐約,洛杉磯,奧斯汀]}

更新!

我剛剛發現我的數據中有重複,這不是一個好消息,因爲我想讓出發點不同。現在它看起來是這樣的:

公路X,紐約,芝加哥

公路X,紐約,芝加哥

公路Z,洛杉磯,芝加哥

公路X,奧斯汀,芝加哥

公路ZZ,邁阿密,芝加哥

公路X,紐約,芝加哥

+0

所以你試圖找出存儲數據,以便爲每個城市,你可以看到你可以去到其他城市的最佳方式? – jlarks32

+0

@ jlarks32我正試圖找到一種方法來存儲所有這些數據,並像摘要一樣打印出來。 – ThomasWest

回答

1

使用在你的字典元組的列表。每個元組中的第一項是高速公路,第二項是起點。

routes = {'Chicago': [('Highway X', 'NY'), ('Highway Z', 'LA'), ('Highway AX', 'Austin'), ('Highway ZZ', 'Miami')]} 

然後是微不足道的產生摘要:

for city in routes: 
    paths = ', '.join(sorted({route[0] for route in routes[city]})) 
    print("There are {} starting points to reach {}. To access this city, you can use: {}".format(len(routes[city]), city, paths)) 

第一行使用了一套修真刪除重複的公路,然後排序並加入他們做出一個字符串。然後,該字符串以及目標城市和路線數量將用於構造最終的摘要字符串。上面的代碼的輸出將是:

 
There are 4 starting points to reach Chicago. To access this city, you can use: Highway X, Highway Z, Highway ZZ 

一種簡單的方法來構造routes字典是使用列表的collections.defaultdict。假設你的數據從一個CSV文件來:

import csv 
from collections import defaultdict 

routes = defaultdict(list) 

with open('data.csv') as f: 
    reader = csv.reader(f) 
    for highway, start, dest in reader: 
     routes[dest].append((highway, start)) 
+0

謝謝你,我已經試過了,它工作!我想問一個後續問題。是否有可能根據大多數出發點對目的地城市進行排序?假設我的數據是芝加哥= 4個起點,西雅圖= 12個起點,SF = 2個起點。然後,我的代碼將首先打印西雅圖,然後是芝加哥和SF。 – ThomasWest

+0

嗨,我剛剛發現我的數據中有重複。我追加時是否有辦法消除這種重複? – ThomasWest

+0

重複副本::是,使用一組元組(而不是列表)並將'routes [dest] .append()'改爲'routes [dest] .add()'。 – mhawke

0

嵌套一些字典。這可以讓你按照「路線」。

{'Highway X': {'Austin': 'Chicago', 'NY': 'Chicago'}, 
'Highway Z': {'LA': 'Chicago'}, 
'Highway ZZ': {'Miami': 'Chicago'}} 

或者:

{'Austin': {'Highway X': 'Chicago'}, 
'LA': {'Highway Z': 'Chicago'}, 
'Miami': {'Highway ZZ': 'Chicago'}, 
'NY': {'Highway X': 'Chicago'}} 
+0

我會先試試這個。謝謝! – ThomasWest

1

組織數據的最佳方法取決於你想與他們做什麼。

你想回答這樣的問題,比如「我在奧斯汀,哪條高速公路需要去芝加哥?「

那麼你的鑰匙應該是出發城市:

lookup = {'Austin': 'Highway X', 
      'NY': 'Highway X', 
      'LA': 'Highway Z', 
      'Miami': 'Highway ZZ'} 

因爲這樣你可以通過簡單地查看了提問者的出發點回答這個問題:

lookup['Austin'] 
# prints 
# Highway X 

但是,如果你想回答不同的問題,如「有人在X高速公路上行駛,哪個城市更有可能來自哪個城市?」,那麼你會組織不同的數據。

如果你有理由噸要打印出來,用一個「律」(名單列表)

table = [["Highway X", "NY", "Chicago"], 
     ["Highway Z", "LA", "Chicago"], 
     ["Highway X", "Austin", "Chicago"], 
     ["Highway ZZ", "Miami", "Chicago"]] 

然後你就可以輕鬆地格式化

for row in table: 
    print("{:12}{:8}{:10}".format(*row)) 
+0

這是一個非常好的選擇。謝謝! – ThomasWest