由函数作为 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'
那是因为您无法将列表添加到号码。
我有一组函数 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'
那是因为您无法将列表添加到号码。