0

我有一个 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

谢谢

4

2 回答 2

2

既然你想要一个单线,这样的事情应该可以帮助你:

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/转换False1/ 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)
于 2020-10-28T11:25:15.480 回答
1

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

  • 跨可迭代/序列func的元素p[0], , ...映射函数是. p[1]pmap(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
于 2020-10-28T11:44:06.670 回答