以迴圈遍訪字典
因為字典能放入大量的資料,所以Python允許我們使用迴圈來遍訪字典的所有內容。
字典允許用很多種方式來儲存資料,因此迴圈遍訪的方式也有幾種不同的作法,
可以迴圈遍訪字典的所有鍵 - 值對、或只遍訪所有的鍵、或只遍訪所有的值。
遍訪字典中所有的鍵 - 值對
下列字典中存放了使用者的帳戶名稱、姓和名等:
1 2 3 4 5
| user_0 = { 'username': 'efermi', 'first': 'enrico', 'last': 'fermi', }
|
若要取得此字典中的所有資訊時,做法是使用一個 for 迴圈來遍訪這個字典:
1 2 3 4 5 6 7 8 9
| user_0 = { 'username': 'efermi', 'first': 'enrico', 'last': 'fermi', }
for key, value in user_0.items(): print("\nKey: " + key) print("Value: " + value)
|
在 for 迴圈中,可宣告兩變數來存放鍵 - 值對中的鍵和值,這兩個變數可取任何名字。
for 陳述句的第二個部份包括字典名稱和跟在後面的 item() 方法,此方法會返回鍵 - 值對串列:
1 2 3 4 5 6 7 8
| Key: username Value: efermi
Key: first Value: enrico
Key: last Value: fermi
|
若在遍訪字典時鍵 - 值對的返回順序可能和存放順序不同,
Python不管鍵 - 值對在字典中的存放順序,只關心鍵和值之間的相互關聯。
在 Part I.介紹的範例中也可以使用迴圈遍訪,而在迴圖中可用 name 和 language 來當存放的變數,
不再用 key 和 value 這樣的名稱,能讓人更容易了解其程式迴圈的作用和目的:
1 2 3 4 5 6 7 8 9
| favorite_languages = { 'jen': 'python', 'sarah': 'c', 'edward': 'ruby', 'phil': 'python', }
for name, language in favorite_languages.items(): print(name.title() + "'s favorite language is " + language.title() + ".")
|
以這幾行程式碼,就能把所有人的喜好程式語言完全輸出:
1 2 3 4
| Jen's favorite language is Python. Sarah's favorite language is C. Edward's favorite language is Ruby. Phil's favorite language is Python.
|
就算字典中儲存了數千,數百萬個人的資料,這樣的迴圈也一樣能順利運作。
遍訪字典中的所有鍵
當不需要運用字典中的「值」,只需處理「鍵」的時候,key()方法就很有用:
1 2 3 4 5 6 7 8 9
| favorite_languages = { 'jen': 'python', 'sarah': 'c', 'edward': 'ruby', 'phil': 'python', }
for name in favorite_languages.keys(): print(name.title())
|
告訴Python擷取 favorite_languages 字典中所有的「鍵」並逐一存入到 name變數內:
迴圈遍訪字典時,預設的處理動作就是遍訪所有的「鍵」,因此for迴圈可以更換為:
1
| for name in favorite_languages:
|
如果將 key()方法明顯地寫在程式中會更易讓人理解,或著也可省略不加。
以前面的迴圈遍訪字典中的名字(鍵),但當遍訪到指定好友的名字時,就輸出一條訊息告知其最喜歡的程式語言:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| favorite_languages = { 'jen': 'python', 'sarah': 'c', 'edward': 'ruby', 'phil': 'python', }
friends = ['phil', 'sarah'] for name in favorite_languages.keys(): print(name.title())
if name in friends: print(" Hi " + name.title() + ", I see your favorite language is " + favorite_languages[name].title() + "!")
|
字典中的每個名字都會輸出,但輸出到好友時會多出一條特別的訊息:
1 2 3 4 5 6
| Jen Sarah Hi Sarah, I see your favorite language is C! Edward Phil Hi Phil, I see your favorite language is Python!
|
也可以使用 key() 方法來確定某個特定的人名字是否有出現在字典內:
1 2 3 4 5 6 7 8 9
| favorite_languages = { 'jen': 'python', 'sarah': 'c', 'edward': 'ruby', 'phil': 'python', }
if 'erin' not in favorite_languages.keys(): print("Erin, please take our poll!")
|
key() 方法並不只用在迴圈遍訪,它會返回一個串列,存放著字典中的所有「鍵」,
由於 ‘erin’ 不在此串列內,因此輸出一條訊息來請她接受訪查:
1
| Erin, please take our poll!
|
以特定順序遍訪字典的鍵
前面曾經提到,「Python不管鍵 - 值對在字典中的存放順序,只關心鍵和值之間的相互關聯。」
若想要以特定的順序返回字典中的項目,就要在 for 迴圈中對返回的「鍵」,
使用 sorted() 函式以複製的方式來取得依照特定順序排列的「鍵」串列:
1 2 3 4 5 6 7 8 9
| favorite_languages = { 'jen': 'python', 'sarah': 'c', 'edward': 'ruby', 'phil': 'python', }
for name in sorted(favorite_languages.keys()): print(name.title() + ", thank you for taking the poll.")
|
for 陳述句用 sorted() 函式對 dictionary.keys() 進行處理,讓 Python 在列出字典中所有「鍵」之後,
並在遍訪之前對這些「鍵」進行了排序:
1 2 3 4
| Edward, thank you for taking the poll. Jen, thank you for taking the poll. Phil, thank you for taking the poll. Sarah, thank you for taking the poll.
|
以迴圈遍訪字典中所有的值
如果感興趣的是字典中所存放的「值」,則可使用 values() 方法來處理,
此方法會返回字典中所有「值」的串列,而不包含「鍵」:
1 2 3 4 5 6 7 8 9 10
| favorite_languages = { 'jen': 'python', 'sarah': 'c', 'edward': 'ruby', 'phil': 'python', }
print("The following languages have been mentioned:") for language in favorite_languages.values(): print(language.title())
|
for 陳述句會擷取字典中所有的「值」,並將它們依序存放到 language 變數內:
1 2 3 4 5
| The following languages have been mentioned: Python C Ruby Python
|
若要刪除重複的值,可使用「集合( set )」來達成。
集合的概念與串列很相似,但存放其中的每個項目都必須是唯一的:
1 2 3 4 5 6 7 8 9 10
| favorite_languages = { 'jen': 'python', 'sarah': 'c', 'edward': 'ruby', 'phil': 'python', }
print("The following languages have been mentioned:") for language in set(favorite_languages.values()): print(language.title())
|
使用 set()來處理從字典取回的「值」串列,就會讓 Python 取出唯一不重複的「值」項目,
並以這樣「值」建立成一個集合:
1 2 3 4
| The following languages have been mentioned: Python C Ruby
|
隨著持續學習 Python ,通常就會發現一些好用的內建功能,這些功能大都能依需要來處理資料。