迭代(遍歷)

迭代字典

要遍歷字典的全部關鍵字,可像遍歷序列那樣使用普通的for語句。函數

d = {'x': 1, 'y': 2, 'z': 3} for key in d: print(key, 'corresponds to', d[key]

也可以使用keys等字典方法來獲取全部的鍵。若是隻對值感興趣,可以使用d.values。你可能還記得,d.items以元組的方式返回鍵-值對。for循環的優勢之一是,可在其中使用序列解包。工具

for key, value in d.items(): print(key, 'corresponds to', value)

注意 字典元素的排列順序是不肯定的。換而言之,迭代字典的鍵或值時,必定會處理全部的鍵或值,但不知道處理的順序。若是順序很重要,可將鍵或值存儲在一個列表中並對列表排序,再進行迭代。要讓映射記住其項的插入順序,可以使用模塊collections中的OrderedDict類。spa

一些迭代工具

Python提供了多個可幫助迭代序列(或其餘可迭代對象)的函數。更具體的在模塊itertools中。code

並行迭代對象

有時候,你可能想同時迭代兩個序列。假設有下面兩個列表:blog

names = ['anne', 'beth', 'george', 'damon'] ages = [12, 45, 32, 102]

若是要打印名字和對應的年齡,能夠像下面這樣作:排序

for i in range(len(names)): print(names[i], 'is', ages[i], 'years old')

i是用做循環索引的變量的標準名稱。索引

一個頗有用的並行迭代工具是內置函數zip,它將兩個序列「縫合」起來,並返回一個由元組組成的序列。返回值是一個適合迭代的對象,要查看其內容,可以使用list將其轉換爲列表。ip

>>> list(zip(names, ages)) [('anne', 12), ('beth', 45), ('george', 32), ('damon', 102)]

「縫合」後,可在循環中將元組解包。字符串

for name, age in zip(names, ages): print(name, 'is', age, 'years old')

函數zip可用於「縫合」任意數量的序列。須要指出的是,當序列的長度不一樣時,函數zip將在最短的序列用完後中止「縫合」。

>>> list(zip(range(5), range(100000000))) [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]

迭代時獲取索引

在有些狀況下,你須要在迭代對象序列的同時獲取當前對象的索引。例如,你可能想替換一個字符串列表中全部包含子串'xxx'的字符串。固然,完成這種任務的方法有不少,但這裏假設你要像下面這樣作:

for string in strings: if 'xxx' in string: index = strings.index(string) # 在字符串列表中查找字符串
        strings[index] = '[censored]'

這可行,但替換前的搜索好像沒有必要。另外,若是沒有替換,搜索返回的索引可能不對(即返回的是該字符串首次出現處的索引)。下面是一種更佳的解決方案:

index = 0 for string in strings: if 'xxx' in string: strings[index] = '[censored]' index += 1

這個解決方案雖然能夠接受,但看起來也有點笨拙。另外一種解決方案是使用內置函數enumerate

 

for index, string in enumerate(strings): if 'xxx' in string: strings[index] = '[censored]'

這個函數讓你可以迭代索引-值對,其中的索引是自動提供的。

反向迭代和排序後再迭代

來看另外兩個頗有用的函數:reversedsorted。它們相似於列表方法reversesortsorted接受的參數也與sort相似),但可用於任何序列或可迭代的對象,且不就地修改對象,而是返回反轉和排序後的版本。

 

>>> sorted([4, 3, 6, 8, 3]) [3, 3, 4, 6, 8] >>> sorted('Hello, world!') [' ', '!', ',', 'H', 'd', 'e', 'l', 'l', 'l', 'o', 'o', 'r', 'w'] >>> list(reversed('Hello, world!')) ['!', 'd', 'l', 'r', 'o', 'w', ' ', ',', 'o', 'l', 'l', 'e', 'H'] >>> ''.join(reversed('Hello, world!')) '!dlrow ,olleH'

請注意,sorted返回一個列表,而reversedzip那樣返回一個更神祕的可迭代對象。你無需關心這到底意味着什麼,只管在for循環或join等方法中使用它,不會有任何問題。只是你不能對它執行索引或切片操做,也不能直接對它調用列表的方法。要執行這些操做,可先使用list對返回的對象進行轉換。

提示 要按字母表排序,可先轉換爲小寫。爲此,可將sortsortedkey參數設置爲str.lower。例如,sorted("aBc", key=str.lower)返回['a', 'B', 'c']

 使用break直接跳出循環

continue

語句continue沒有break用得多。它結束當前迭代,並跳到下一次迭代開頭。這基本上意味着跳過循環體中餘下的語句,但不結束循環。這在循環體龐大而複雜,且存在多個要跳過它的緣由時頗有用。在這種狀況下,可以使用continue.

相關文章
相關標籤/搜索