python - 基本问题:表达式后的 for 循环(迭代器)
问题描述
我正在努力了解 Python 如何处理变量之后的循环。我认为它可能与 Python 中的迭代器/迭代器有关,但我不确定我是否真的理解它的用法。基本上在下面的代码中,我理解了为什么它可以产生变量组合的数学原理,但我不明白这是创建列表的有效方法。根据我使用其他语言的经验,for 循环总是在表达式之前出现,并且在有多个时正确嵌套。
temp = [('CH', 'AG', 'ME', 'GS')]
[(temp[i],temp[j]) for i in range(len(temp)) for j in range(i+1, len(temp))]
#produces:[('CH', 'AG'), ('CH', 'ME'), ('CH', 'GS'),
#('AG', 'ME'),('AG', 'GS')('ME', 'GS')]
谁能解释这里发生了什么?
解决方案
内联for
循环最终相互嵌套。如果你要把它写出来,你会这样做:
temp = [('CH', 'AG', 'ME', 'GS')]
ret = []
for i in range(len(temp)):
for j in range(i+1, len(temp)):
ret.append((temp[i], temp[j]))
基本上,如果你有多个内联 for 循环,它们会嵌套,这样你声明的第一个是外循环,你声明的最后一个是内循环。有关更详细的说明,请参阅此 Stackoverflow 问题。
Python 允许将这些“列表推导式”作为简写,因为它更容易且更“pythonic”(要了解这意味着什么,请打开 python 控制台并键入import this
;这里的相关陈词滥调是“平面比嵌套更好”)。您会看到如何以非常简单易懂的方式在一行中创建整个列表,而不是像大多数情况下那样必须写出四行并逐步逐步构建数组其他语言。
推荐阅读
- mongodb - 有没有办法找到给定数组的哪些元素不在数据库中
- maven-3 - 我收到错误消息:无法执行插件“Cucumber Artifact Copier”
- mysql - 在 MySQL 中使用 Json 键值对对象查找和替换字符串
- azure - Azure VM - 注册表更改阻止启动机器
- javascript - 如何模拟 AWS sqs 调用以进行单元测试
- arduino - IMU 设备 - 如何在设备垂直时通过计算欧拉角获得水平旋转角
- java - 如何将 JPA 默认获取更改为 LAZY
- javascript - ployly.js 时间序列图表上的 yaxis 自定义标签有什么解决方案吗?
- android - 应用在 Play 商店上线时,有 0 台设备支持 Android 应用
- sql - 需要公式先前值的公式 (SQL Server 2017)