python-3.x 如何从列表解析中获得多个列表作为单独的结果?

yh2wf1be  于 2023-01-03  发布在  Python
关注(0)|答案(6)|浏览(144)

假设我有这样的代码:

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]
tzcvj98z

tzcvj98z1#

注意,return 2*x,xreturn (2*x,x)的缩写,即a tuple。因此,您的列表解析生成了一个tuple列表,而不是列表的tuple。不过,zip的好处是,您可以轻松地使用星号将其反向

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的工作,这是不优雅的,而且效率可能很低。

z18hc3ub

z18hc3ub2#

让我们把它做好。函数很好:

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]
ugmeyewa

ugmeyewa3#

使用内置函数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))
4nkexdtk

4nkexdtk4#

用途

zip(*your_list_of_bituples)

示例

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

将给予

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

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

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]

相关问题