由函数作为 oneliner 返回的平面对列表

Flat list of pairs returned by functions as oneliner

我有一组函数 fns 和每个函数 returns 一对整数 [a,b]。我需要调用每个函数并将结果加入一个平面列表中。如果没有理解,代码将如下所示:

res = []
for fn in fns:
    res += fn()
return res

问题是,我可以把这个写成单行吗?我对 [*fn() for fn in fns] 寄予厚望,但不幸的是 Python 不理解此处的解包运算符并抛出语法错误。

简单地使用双重理解来解压你的价值观:

res = [i for fn in fns for i in fn()]

# Same as:
res = []
for fn in fns:
    for i in fn():
        res += i

或使用itertools.chain.from_iterable:

import itertools

res = list(itertools.chain.from_iterable(fn() for fn in fns))

演示:

def a():
    return (1, 2)

def b():
    return (3, 4)

def c():
    return (5, 6)

fns = [a, b, c]
res = list(itertools.chain.from_iterable(fn() for fn in fns))
>>> res
[1, 2, 3, 4, 5, 6]

一种不太优雅的方法,但仍然是单行的,将使用 sum():

result = sum([fn() for fn in fns], [])

here所述,sum可以接受两个参数,iterable 和 start。

所以,如果你想对一个列表求和,例如 l = [1, 2, 3, 4],你调用:

r = sum(l)

基本上是:

r = sum(l, 0)

其中0是求和的起始数。

以上是快捷方式:

r = 0
for elem in l:
    r += elem

同样的方法适用于列表。开头的一行代码是您的代码的快捷方式。需要设置空列表 [],否则 sum 会将参数默认为 0,这将引发错误:

TypeError: unsupported operand type(s) for +: 'int' and 'list'

那是因为您无法将列表添加到号码。