【问题标题】:Iterate through list to create new list with IDs Python遍历列表以创建具有 ID 的新列表 Python
【发布时间】:2020-07-21 19:39:12
【问题描述】:

所以我正在尝试使用 IMDBpy 模块将程序列表连接到它们各自的流派。首先,我试图获取他们的 IMDB ID 的新列表,以便从那里获得相应的流派。 不幸的是,我无法遍历我的程序列表并生成相应 ID 的新列表。不知何故,我的函数在第一次迭代时卡住了。我的定义中缺少什么?

from imdb import IMDB
ia = IMDb()
programs = ['midsomer murders', 'wheeler dealers: dream car', 'solo: a star wars story (2018)']
def ids_list(x):
    ids = []
    for item in list(x):
        movie = ia.search_movie(item)[0].getID()
        for movie in movies:
            ids.append(movie)
        return ids
    
ids_list(programs)

输出:

['0118401']

您可以看到只有第一项通过,而我的代码建议它应该在通过ia.search_movie(item)[0].getID() 运行后附加列表中的每个项目。提前致谢!

【问题讨论】:

  • return ids移出outer-for-loop试试
  • 我的意思是 un-indent return 声明一次
  • 是的,刚刚完成,现在我得到一个 IndexError: list index out of range
  • 这行 - ia.search_movie(item)[0] - 有时你可能没有得到任何元素,所以当你尝试访问 0-th 元素时它会抛出错误
  • 在该行之前像这样使用if len(ia.search_movie(item)):

标签: python list for-loop


【解决方案1】:

您的退货缩进不正确。它在 for 循环的第一次迭代后返回:

from imdb import IMDb
ia = IMDb()
programs = ['midsomer murders', 'wheeler dealers: dream car', 'solo: a star wars story (2018)']
def ids_list(x):
    ids = []
    for item in list(x):
        movie = ia.search_movie(item)
        if movie:
          ids.append(movie[0].getID())
        else:
          ids.append(None)
    return ids
    
print(ids_list(programs))

使用列表理解和赋值运算符的缩短版本(Python 3.8+):

from imdb import IMDb
ia = IMDb()
programs = ['midsomer murders', 'wheeler dealers: dream car', 'solo: a star wars story (2018)']
def ids_list(x):
    return [m[0].getID() if (m:=ia.search_movie(i)) else None for i in x]
    
print(ids_list(programs))

【讨论】:

  • (m:=ia.search_movie(i)) 中的代码再次出现语法错误
  • 缩短版需要 python 3.8+。我猜你使用的是旧版本。您可以使用顶级版本
  • 是的,我是,顶级版本也给了我 TypeError: quote_from_bytes() expected bytes 我认为这与搜索电影值不是字符串有关。
  • 那将是程序列表的问题,其中包含您未显示的数据。您应该检查列表程序中的输出。您可以将其转换为字符串,但真正的问题是您的原始列表格式不正确,需要修复,以及您得到字符串以外的其他内容的原因。
  • 另外,您确定只希望找到第一部电影的 ID,而不是找到所有可能的 ID?
【解决方案2】:

我的意思是将您的 for-loop 代码更改为:

for item in list(x):
    if len(ia.search_movie(item)):
        movies = ia.search_movie(item)[0].getID()
        [ids.append(movie) for movie in movies]
return ids

【讨论】:

    猜你喜欢
    • 2018-07-30
    • 1970-01-01
    • 2017-05-07
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多