我有一个 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
谢谢
我有一个 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, 3), (2, 4), (3, 5)]))
印刷:
[((1, 3),), ((2, 4),), ((3, 5),)]
添加*
之前map
会转置list
:
list(zip(*map(func,p)))
印刷:
[(1, 2, 3), (3, 4, 5)]
该all
函数与简单的列表推导相结合,以查找子列表 1 的所有元素是否相等。这是一个更简单的版本:
all(ele == lst[0] for ele in lst)
在这种情况下也应用了同样的方法:
all(ele == list(zip(*map(func,p)))[0][0] for ele in list(zip(*map(func,p)))[0])
印刷:
False
为了将True
/转换False
为1
/ 0
,我使用了以下int()
功能:
int(all(ele == list(zip(*map(func,p)))[0][0] for ele in 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,2,3]
a,b = 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])
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