繁体   English   中英

了解列表理解中的 python 嵌套迭代

[英]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列表中。 请参阅appendextend的文档。 https://docs.python.org/3/tutorial/datastructures.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM