如何将多个列表与列表理解的单独结果获取



假设我有此代码:

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]

请注意, return 2*x,x对于return (2*x,x),即一个元组。因此,您的列表理解生成了一个元组的列表,而不是列表的元组。zip的好处是,您可以在Asterisk中轻松地在反向中使用它:

xlist,ylist = zip(*[f(value) for value in x])
#                 ^ with asterisk

请注意,xlistylist将为元组(因为zip将被打开包装)。如果您希望它们成为列表,则可以使用:

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的工作,这是不高度效率的。

让我们做起来。功能很好:

def f(x):
  return 2*x, x*x

但是您想定义如下的范围,请注意启动和结束值:

x = range(1, 4)

另外,您必须使用 value 调用该功能,而不是 list 作为参数。将结果解压缩为两个列表的最后技巧是简单地 zip(*lst)列表的结果理解:

xlist, ylist = zip(*[f(value) for value in x])

现在结果是预期的:

xlist 
=> [2, 4, 6]
ylist 
=> [1, 4, 9]

使用构建功能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))

使用

zip(*your_list_of_bituples)

示例

demo_list = [(1, 2), (2, 3), (4, 5)]
zip(*demo_list)

将给予

[(1, 2, 4), (2, 3, 5)]

我知道已经晚了,但是以下是您想要的。

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}")
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]

最新更新