假设我有这段代码:
def f(x):
return 2*x,x*x
x = range(3)
xlist, ylist = [f(value) for value in x]
我怎样才能整齐地得到这样的结果?
xlist = [0, 2, 4]
ylist = [0, 1, 4]
原文由 Christophe 发布,翻译遵循 CC BY-SA 4.0 许可协议
假设我有这段代码:
def f(x):
return 2*x,x*x
x = range(3)
xlist, ylist = [f(value) for value in x]
我怎样才能整齐地得到这样的结果?
xlist = [0, 2, 4]
ylist = [0, 1, 4]
原文由 Christophe 发布,翻译遵循 CC BY-SA 4.0 许可协议
让我们完成这项工作。功能很好:
def f(x):
return 2*x, x*x
但是您要按如下方式定义范围,请注意起始值和结束值:
x = range(1, 4)
此外,您必须使用 值 调用函数,而不是使用 列表 作为参数。将结果解压缩到两个列表中的最后一个技巧是简单地 zip(*lst)
列表理解的结果:
xlist, ylist = zip(*[f(value) for value in x])
现在结果符合预期:
xlist
=> [2, 4, 6]
ylist
=> [1, 4, 9]
原文由 Óscar López 发布,翻译遵循 CC BY-SA 3.0 许可协议
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答2.9k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
注意
return 2*x,x
是return (2*x,x)
的缩写,即 元组。因此,您的列表理解 会生成一个 list of tuples ,而不是一个 tuple of lists 。zip
的好处 在于,您可以轻松地将其与星号反向 使用:请注意
xlist
和ylist
将是 元组(因为zip
将被解包)。如果你想让它们成为列表,你可以使用:结果是:
另一种方法是使用单独的列表理解:
当然,这会重复
f
的工作,这是不优雅且效率低下的。