内联 for 循环

新手上路,请多包涵

我正在尝试学习整洁的 pythonic 做事方式,并且想知道为什么我的 for 循环不能以这种方式重构:

 q  = [1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5]
vm = [-1, -1, -1, -1]

for v in vm:
    if v in q:
        p.append(q.index(v))
    else:
        p.append(99999)

vm[p.index(max(p))] = i

我尝试将 for 循环替换为:

 [p.append(q.index(v)) if v in q else p.append(99999) for v in vm]

但它不起作用。 for v in vm: 循环逐出 vm 中的数字,基于下一个数字出现在 q 中。

原文由 Will 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 448
2 个回答

您使用的是 Python 中的 列表理解,而不是内联 for 循环(即使它类似于一个)。您可以像这样将循环编写为列表推导式:

 p = [q.index(v) if v in q else 99999 for v in vm]

使用列表理解时,您不要调用 list.append 因为列表是根据理解本身构建的。列表中的每一项都是 for 关键字左侧的表达式返回的内容,在本例中为 q.index(v) if v in q else 99999 。顺便说一句,如果你确实在理解中使用 list.append ,那么你将得到一个 None 值的列表,因为这就是 append 方法总是返回的值。

原文由 user2555451 发布,翻译遵循 CC BY-SA 3.0 许可协议

您的列表理解会起作用,但会返回 None 列表,因为 append 返回 None:

演示:

 >>> a = []
>>> [a.append(x) for x in range(10)]
[None, None, None, None, None, None, None, None, None, None]
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

像这样使用它的更好方法:

 >>> a = [x for x in range(10)]
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

原文由 Hackaholic 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏