如何对多个 return 值使用 python 赋值运算符
How to use python assignment operator with multiple return values
我有一个 Python 函数,它接受一个参数和 returns 2 个输出。我想为列表中的所有元素调用它,并将每个调用的 return 值组合如下:
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
运算符将其重构为单行代码?
谢谢
既然你想要一个 one-liner,像这样的东西应该可以帮助你:
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)
我们可以将这个问题分解成单独的任务:
- 在
p[0]
、p[1]
、... iterable/sequence p
的元素之间映射函数 func
是 map(func, p)
。
- 这已经提供了
(a1, b1)
、(a2, b2)
的可迭代对象,因此赋值不需要特殊处理。
- sequence/iterable
a
的操作链 a1 & a2 & ...
是 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
如果需要,可以写成一个statement/line。
>>> a, b = reduce(lambda new, total: (new[0] & total[0], new[1] + total[1]), map(func, p))
>>> a
1
>>> b
4
我有一个 Python 函数,它接受一个参数和 returns 2 个输出。我想为列表中的所有元素调用它,并将每个调用的 return 值组合如下:
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
运算符将其重构为单行代码?
谢谢
既然你想要一个 one-liner,像这样的东西应该可以帮助你:
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)
我们可以将这个问题分解成单独的任务:
- 在
p[0]
、p[1]
、... iterable/sequencep
的元素之间映射函数func
是map(func, p)
。- 这已经提供了
(a1, b1)
、(a2, b2)
的可迭代对象,因此赋值不需要特殊处理。
- 这已经提供了
- sequence/iterable
a
的操作链a1 & a2 & ...
是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
如果需要,可以写成一个statement/line。
>>> a, b = reduce(lambda new, total: (new[0] & total[0], new[1] + total[1]), map(func, p))
>>> a
1
>>> b
4