迭代(遍历)

迭代字典

要遍历字典的全部关键字,可像遍历序列那样使用普通的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.

相关文章
相关标签/搜索