假设我有这样的代码:
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]
tzcvj98z1#
注意,return 2*x,x是return (2*x,x)的缩写,即a tuple。因此,您的列表解析生成了一个tuple列表,而不是列表的tuple。不过,zip的好处是,您可以轻松地使用星号将其反向:
return 2*x,x
return (2*x,x)
zip
xlist,ylist = zip(*[f(value) for value in x]) # ^ with asterisk
注意xlist和ylist将是元组(因为zip将被解包)。如果你希望它们是列表,你可以用途:
xlist
ylist
xlist,ylist = map(list, zip(*[f(value) for value in x]))
这导致:
>>> xlist [0, 2, 4] >>> ylist [0, 1, 4]
另一种方法是使用单独的列表解析:
xlist = [f(value)[0] for value in x] ylist = [f(value)[1] for value in x]
当然,这重复了f的工作,这是不优雅的,而且效率可能很低。
f
z18hc3ub2#
让我们把它做好。函数很好:
def f(x): return 2*x, x*x
但您希望按如下方式定义范围,请注意起始值和结束值:
x = range(1, 4)
另外,你必须用 value 调用函数,而不是用 list 作为参数,把结果解压缩成两个列表的最后一个技巧是简单地把列表解析的结果zip(*lst):
zip(*lst)
xlist, ylist = zip(*[f(value) for value in x])
现在结果如预期:
xlist => [2, 4, 6] ylist => [1, 4, 9]
ugmeyewa3#
使用内置函数zip(),
zip()
def f(x): return 2*x, x*x x = range(1, 4) xlist, ylist = zip(*[f(value) for value in x]) print(xlist, ylist) # ((2, 4, 6), (1, 4, 9))
4nkexdtk4#
用途
zip(*your_list_of_bituples)
示例
demo_list = [(1, 2), (2, 3), (4, 5)] zip(*demo_list)
将给予
[(1, 2, 4), (2, 3, 5)]
piah890a5#
我知道现在很晚了,但下面的人得到了你想要的。
def f(value): xlist = [] ylist = [] for x, y in [(2*x, x*x) for x in range(value)]: xlist.append(x) ylist.append(y) return xlist, ylist x = int(input("enter a value: ")) xval, yval = f(x) print(f"xlist = {xval}\nylist = {yval}")
mnowg1ta6#
def f(x): yield [2*x, x*x] xlist, ylist = zip(*[next(f(x)) for x in range(3)]) print(list(xlist)) print(list(ylist))
利用产量。
[0, 2, 4] [0, 1, 4] [Program finished]
6条答案
按热度按时间tzcvj98z1#
注意,
return 2*x,x
是return (2*x,x)
的缩写,即a tuple。因此,您的列表解析生成了一个tuple列表,而不是列表的tuple。不过,zip
的好处是,您可以轻松地使用星号将其反向:注意
xlist
和ylist
将是元组(因为zip
将被解包)。如果你希望它们是列表,你可以用途:这导致:
另一种方法是使用单独的列表解析:
当然,这重复了
f
的工作,这是不优雅的,而且效率可能很低。z18hc3ub2#
让我们把它做好。函数很好:
但您希望按如下方式定义范围,请注意起始值和结束值:
另外,你必须用 value 调用函数,而不是用 list 作为参数,把结果解压缩成两个列表的最后一个技巧是简单地把列表解析的结果
zip(*lst)
:现在结果如预期:
ugmeyewa3#
使用内置函数
zip()
,4nkexdtk4#
用途
示例
将给予
piah890a5#
我知道现在很晚了,但下面的人得到了你想要的。
mnowg1ta6#
利用产量。