python - 了解列表理解中的python嵌套迭代
问题描述
我很难解释列表理解中的嵌套迭代。下面的代码
movie = []
genre = []
for movie_ids in ratings["movie_id"].values:
movie.append(movie_ids)
genre.append([x for movie_id in movie_ids for x in genres_dict[movie_id]])
如果我打印genre[0]
假设我看到一个结果[a,b,c]
我从这个和互联网上的许多其他人的理解是我可以更换这条线
genre.append([x for movie_id in movie_ids for x in genres_dict[movie_id]])
和
for movie_id in movie_ids:
if movie_id in genres_dict:
genre.append(genres_dict[movie_id])
但是当我打印时,这会产生不同的结果genre[0]
我错过了什么?
请建议
解决方案
使用列表理解,您还可以遍历genres_dict[movie_id]
. 此代码不会完全转换为您提供的 for 循环,而是转换为
for movie_id in movie_ids:
for x in genres_dict[movie_id]
genre.append(x)
我省略了该if
语句,因为尽管测试密钥是否存在并不是一个坏主意,但嵌套迭代也不会执行此测试。嵌套迭代本质上执行您提供的 for 循环,嵌套从左到右,然后附加表达式的结果。
此外,附加列表推导的结果并不会单独添加列表推导的每个元素,而是将整个列表添加为一个元素。所以代码实际上执行
list_out = []
for movie_id in movie_ids:
for x in genres_dict[movie_id]
list_out.append(x)
genre.append(list_out)
如果要添加列表推导的所有元素,则应改为使用list.extend
,它将可迭代对象作为参数并将每个元素添加到列表中。在您的原始代码中,这将是
genre.extend([x for movie_id in movie_ids for x in genres_dict[movie_id]])
.
推荐阅读
- docker - docker minio 在开始时失败并出现错误:“磁盘路径已满”
- java - 没有合格的 bean,使用 Spring Data JPA 设置 2 个数据源
- ios - Swift SceneKit:为什么过早检测到节点之间的接触?
- python - 当恰好在两个正方形之间时,圆会改变其方向
- python - 从 PyPI 包创建 conda 包有什么意义吗?
- svg - 是否可以在不使用 Illustrator 之类的编辑器的情况下更改 svg 中线条的粗细?
- quarkus - 支持在热点上运行的 quarkus 的 Java 版本
- c++ - 如何使用正在运行的线程正确退出/返回主线程?
- python-3.x - ML 中是否有库或模型可用于将文本转换为结构化内容(如表格)
- sql-server - 如何将一行与 Visual Basic 中的特定 SQL 列相关联?