微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用具有多个返回值的python赋值运算符

如何解决如何使用具有多个返回值的python赋值运算符

我有一个Python函数,该函数接受一个参数并返回2个输出。我想为列表中的所有元素调用方法,并结合每次调用的返回值,如下所示:

a1,b1 = func(p[0])
a2,b2 = func(p[1])
a3,b3 = func(p[3])

a = a1 & a2 & a3
b = b1 + b2 + b3

如何在Python中使用+=&=reduce运算符将其重构为一个内衬?

谢谢

解决方法

因为您需要单线,类似这样的东西应该可以帮助您:

a,b = int(all(ele == list(zip(*map(func,p)))[0][0] for ele in list(zip(*map(func,p)))[0])),sum(list(zip(*map(func,p)))[-1])

故障:

map函数将函数应用于可迭代对象。

list(map(func,p))

打印:

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

此:

list(zip([(1,5)]))

打印:

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

*之前添加map会转置list

list(zip(*map(func,p)))

打印:

[(1,2,4,5)]

all函数与简单的列表理解结合在一起,以确定子列表1的所有元素是否相等。这是它的一个简单版本:

all(ele == lst[0] for ele in lst) 

在这种情况下也是如此:

all(ele == list(zip(*map(func,p)))[0])

打印:

False

为了将True / False转换为1 / 0,我使用了int()函数:

int(all(ele == list(zip(*map(func,p)))[0]))

打印:

0

其中的第二部分是:sum(list(zip(*map(func,p)))[-1])计算第二个子列表的总和。

sum(list(zip(*map(func,p)))[-1])

打印:

12

这是完整的代码:

def func(a):
    return a,a+2

p = [1,3]

a,b = all(ele == list(zip(*map(func,p)))[-1])

print(a,b)

输出:

(0,12)
,

我们可以将此问题分解为单独的任务:

  • 将函数func映射到元素p[0]p[1],...的可重复/顺序p上的是map(func,p)
    • 这已经提供了(a1,b1)(a2,b2)的可迭代项,因此分配不需要特殊处理。
  • 序列/可迭代a1 & a2 & ...的操作链areduce(lambda new,total: new & total)+同样。
    • 因为我们有一对(a1,b1),...的流,而不是一对a1,...b1,...的流,所以我们必须同时对它们进行操作。
  • 减少成对的流的结果是一对,我们可以将其分配为两个变量a,b = result
from functools import reduce

def func(a): return a,a
p = range(1,5,2)


def reduction(new,total):
    return new[0] & total[0],new[1] + total[1]

mapped = map(func,p)
reduced = reduce(reduction,mapped)
a,b = reduced

如果需要,可以将其写成一条语句/一行。

>>> a,b = reduce(lambda new,total: (new[0] & total[0],new[1] + total[1]),map(func,p))
>>> a
1
>>> b
4

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。