首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python基础教程 一些迭代工具

5.5.4 一些迭代工具

Python提供了多个可帮助迭代序列(或其他可迭代对象)的函数,其中一些位于第10章将介绍的模块itertools中,但还有一些内置函数使用起来也很方便。

1. 并行迭代

有时候,你可能想同时迭代两个序列。假设有下面两个列表:

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将其转换为列表。

>>> 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')

2. 迭代时获取索引

在有些情况下,你需要在迭代对象序列的同时获取当前对象的索引。例如,你可能想替换一个字符串列表中所有包含子串'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]'

这个函数让你能够迭代索引值对,其中的索引是自动提供的

3.反向迭代和排序后再迭代

来看另外两个很有用的函数: reversed和sorted。它们类似于列表方法reverse和sort(sorted接受的参数也与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返回一个列表,而reversed像zip那样返回一个更神秘的可迭代对象。你无需关心这到底意味着什么,只管在for循环或join等方法中使用它,不会有任何问题。只是你不能对它执行索引或切片操作,也不能直接对它调用列表的方法。要执行这些操作,可先使用list对返回的对象进行转换。

提示 要按字母表排序,可先转换为小写。为此,可将sort或sorted的key参数设置为str.lower。例如, sorted("aBc", key=str.lower)返回['a', 'B', 'c']。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180918G0DTTF00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券