[英]Understanding python nested iteration inside a list comprehension
我很难解释列表理解中的嵌套迭代。 下面的代码
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]])
。
列表推导实际上是在为您展平数组,因为它还迭代了内部内容。
等效的代码块就是这个。 注意extend
vs append
。
for movie_id in movie_ids:
if movie_id in genres_dict:
genre.extend(genres_dict[movie_id])
extend
负责迭代每个项目并将其添加到genre
列表中。 请参阅append
与extend
的文档。 https://docs.python.org/3/tutorial/datastructures.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.