如何解决如何使用具有多个返回值的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 & ...
的操作链a
为reduce(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 举报,一经查实,本站将立刻删除。