【问题标题】:invalid syntax error when using for loop on a zip object在 zip 对象上使用 for 循环时出现无效的语法错误
【发布时间】:2020-03-03 09:45:18
【问题描述】:

我正在学习如何优化 python 3.7 中的循环,但我不断收到“无效的语法错误”。我已经检查了缺少的括号。代码如下:

    best = probabilities[0]
    best = (probabilities[i] for i in range(1, len(probabilities)) if probabilities[i] > best)
    print(best)
    prob, im = (prob, im for prob, im in zip(probabilities, image_names) if prob == best)

    return (prob, im)

给我错误

  File "path", line 27
    prob, im = (prob, im for prob, im in zip(probabilities, image_names) if prob == best)
                           ^
SyntaxError: invalid syntax

我不确定出了什么问题,因为我在另一个练习中使用的以下代码使用了几乎相同的语法:

im = [im for im, prob in zip(image_names, probabilities) if prob >= threshold]
    return (im)

编辑: 我也试过了

return (prob, im for prob, im in zip(probabilities, image_names) if prob == best)

它说变量类型是 Generator[tuple[float, str], Any, None] 但我不确定它是什么意思。

任何帮助将不胜感激

【问题讨论】:

  • 一旦你修复了语法错误,这仍然没有意义。生成器创建一个 ((prob, im), (prob, im), (prob, im), ...) 形式的元组,然后将其分配给两个变量。
  • 仅供参考,第一个循环可以简化为 best = max(probabiliites)
  • @Barmar 如果prob 的值等于best,我想将元组的值放在变量prob 和im 中。
  • 另外我不知道有max函数,谢谢提供信息
  • 您想获取生成器中选择的所有probim 值的单独元组吗?

标签: python for-loop zip syntax-error


【解决方案1】:

你让这变得比必要的复杂得多。

只需在同一个循环中设置两个变量

best = probabilities[0]
best_image = image_names[0]
for index, prob in enumerate(probabilities):
    if prob > best:
        best = prob
        best_image = image_names[index];

【讨论】:

  • 谢谢。这就是我通常会做的,但目标是让代码尽可能快
  • 我相信这是尽可能快的。
  • 它肯定比我在阅读答案return (tuple( (prob, im) for prob, im in zip(probabilities, image_names) if prob == best)[0]) 后写的要快得多,但它仍然比我应该优化的代码慢 30%。
  • best_name, best_proba = image_names[0], probabilities[0] for i in range(1, n): if best_proba < probabilities[i]: best_proba, best_name = probabilities[i], image_names[i] return best_proba, best_name
  • 这与我的代码几乎相同,唯一的区别是使用best_name 而不是best_index。我很难相信有 30% 的差异。
【解决方案2】:

当由理解/生成器表达式生成时,元组需要显式包装在 () 中:

((prob, im) for prob, im in zip(probabilities, image_names) if prob == best) 

【讨论】:

  • 你的意思是prob, im = ((prob, im) for prob, im in zip(probabilities, image_names) if prob == best)?我试过了,但我得到了ValueError: not enough values to unpack (expected 2, got 1)
  • @RJ9 这就是我在上面的评论中提出的观点。您正在尝试分配两个变量,但生成器会生成不同数量的元组。您似乎期望它为您转换数据。
  • @RJ9 这是一个不相关的错误,现在显示语法错误已修复。
  • [0]添加到生成器的末尾以获取元组的第一个元素。
猜你喜欢
  • 1970-01-01
  • 2014-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2019-03-16
相关资源
最近更新 更多