首页 > 解决方案 > 了解列表理解中的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]

我错过了什么?

请建议

标签: pythonlist-comprehension

解决方案


使用列表理解,您还可以遍历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]]).


推荐阅读