2016-06-13 94 views
0

我是非常新的Python,所以請裸露在我身邊(使用學習python的困難方式,它不能很好地解釋這一點)。具有多個值的Python字典密鑰

我正在學習字典,我知道我可以通過創建兩個字典來實現這一點,但爲了簡潔起見,我想讓代碼更簡潔一點,而不是再創建兩個字典(已授予,最後,我爲這個詞典所寫的所有內容都必須寫在其他詞典中),所以我想我比任何事都更好奇。而且我知道我不應該使用for循環,但我不知道另一種方式,就LPTH吮吸而言,我不得不從某處開始。

問題1:我如何得到這個循環遍歷每個州/省/城市?我是否需要製作多個詞典或一系列列表並使用它們?問題2:爲什麼這段代碼運行for循環11次?

states1 = { 
    '1': 'Oregon', 'a': 'OR','population': '1000', 
    '2': 'Florida', 'b': 'MI', 'population': '1000', 
    '3': 'California', 'c': 'CA', 'population': '1000', 
    '4': 'NewYork', 'd': 'NY', 'population': '1000', 
    '5': 'Michigan','e': 'MI','population': '1000', 
} 

for city, pop, in states1.items(): 
    print "%s has the abbreviation %s and a population of %s" %states1['1'], states1['a'], states1['population']) 

回答

1

理想情況下,你會有一個homgonous數據結構 - 例如, a listdict 。每個dict將持有的有關特定狀態:

states1 = [ 
    {'name': 'Oregon', 'abbrev': 'OR', 'population': 1000}, 
    {'name': 'Florida', 'abbrev': 'FL', 'population': 1000}, 
    ..., 
] 

現在你的循環如下所示:

for state in states1: 
    print print "%s has the abbreviation %s and a population of %s" % (state['name'], states['abbrev'], states['population']) 

這樣做的好處是希望清晰。對於任何給定的狀態,都以相同的方式檢索相關信息(通過'name'鍵可以始終訪問州的名稱)。

如果你需要國家名稱的映射(例如,你想通過自己的縮寫查找一堆國家的人口),你可以做到這一點很容易地創建一個字典...

abbrev_to_state = {state['abbrev']: state for state in states1} 
florida_data = abbrev_to_state['FL'] 
new_hampshire_data = abbrev_to_state['NH'] 
... 

此處還有其他選項...您可以使用自定義類,但這似乎也是collections.namedtuple列表的一個好候選,假設您不打算更改數據。

+0

這幫了TON mgilbson,我不敢相信我沒有想到這件事,現在看起來很愚蠢! – Wolverine

0

您可以使每個值成爲一個列表。

我不明白你想實現什麼,但最簡單的方法是:

states1 = { 
1: ["Oregon", "OR", 1000] 
2: ["Florida", "FL", 1000] 
3: ["Pythonville", "PY", 1000] 
4: ["Dictville", "DI", 1000] 
} 

你可以看看了另一件事情是named tuple,這是我最喜歡的數據結構之一,當你想快速組織數據。

from collections import namedtuple 

CityInfo = namedtuple("CityInfo", ["Name", "Abbr", "Pop"]) 

states1 = { 
      1: CityInfo("Oregon", "OR", 1000), 
      2: CityInfo("Florida", "FL", 1000), 
      3: CityInfo("Pythonville", "PY", 1000), 
      4: CityInfo("Dictville", "DI", 1000) 
      } 

for city in states1.values(): 
    print("{} has the abbreviation {} and a population of {}".format(city.Name, city.Abbr, city.Pop)) 
+1

FWIW,以連續整數作爲鍵的字典似乎有點像浪費內存。在這種情況下,「list」通常更好:-) – mgilson

+0

是的,是的。但我不想完全改變他的代碼。 – SirSteel

0

當我運行它,你推薦我去(見下文),它吐出

Michigan has the abbreviation MI and a population of 1000 
Michigan has the abbreviation MI and a population of 1000 
Michigan has the abbreviation MI and a population of 1000 

不知道爲什麼它繼續這樣做,我也能猜到,如果它是出於某種原因選擇一個完全隨機的狀態,因爲它是一個字典,每次都會改變狀態,偶爾會出現重複。

states1 = { 
    'state': 'Oregon', 'abbrev': 'OR','population': '10000', 
    'state': 'Florida', 'abbrev': 'MI', 'population': '1000', 
    'state': 'California', 'abbrev': 'CA', 'population': '1000', 
    'state': 'NewYork', 'abbrev': 'NY', 'population': '1000', 
    'state': 'Michigan','abbrev': 'MI','population': '1000', 
} 

for city, pop, in states1.items(): 
    print "%s has the abbreviation %s and has a population of %s" % (states1['state'], states1['abbrev'], states1['population']) 
0

另一個如何根據您的需求構造數據的示例。

states1 = { 
'Oregon': {'abrv': 'OR','population': '1000'}, 
'Florida':{ 'abrv': 'MI', 'population': '1000'}, 
'California':{'abrv': 'CA', 'population': '1000'}, 
'NewYork':{'abrv': 'NY', 'population': '1000'}, 
'Michigan':{'abrv': 'MI','population': '1000'}} 



for state in states1: 
    print "%s has the abbreviation %s and a population of %s" %(state, states1[state]['abrv'], states1[state]['population']) 
+0

我認爲這看起來非常完美,就像第一個建議一樣,但都給了我錯誤。這一個說「File」ex39-test2.py「,第12行,在 print」%s有縮寫%s,並且有%s的總數「%(state,states1 [state] ['abbrev'],狀態1 [狀態] ['人口']) TypeError:不可取消類型:'dict'「 – Wolverine

+0

不確定爲什麼你會得到該錯誤,如果你是準確的代碼。如果我試圖使用字典作爲關鍵字,那麼不可用的字典類型會提高。 – user4642224

0

剛剛看到最後一篇文章,這很有道理。至於如何這可能是有用的,我不知道,這只是我想要做的事情,有三個值的一個關鍵。我相信未來我可以從網站或數據庫中獲取信息,並讓它創建配對,就像扮演角色的演員一樣,但也許不會。這只是我煩惱的事情,我無法自己想出來。

相關問題