给定一个可迭代的,如何在每个可能的组合中应用函数?

Ken*_*tzo -1 python

给定迭代[A, B, C]和函数f(x)我想得到以下内容:

[  A,     B,     C]  
[  A,     B,   f(C)]  
[  A,   f(B),    C]
[  A,   f(B),  f(C)]
[f(A),    B,     C]
[f(A),    B,   f(C)]
[f(A),  f(B),    C]
[f(A),  f(B),  f(C)]
Run Code Online (Sandbox Code Playgroud)

不幸的是我在itertools模块中找不到任何合适的东西.

Joh*_*ooy 9

>>> from itertools import product
>>> L = ["A", "B", "C"]
>>> def f(c): return c.lower()
... 
>>> fL = [f(x) for x in L]
>>> for i in product(*zip(L, fL)):
...     print i
... 
('A', 'B', 'C')
('A', 'B', 'c')
('A', 'b', 'C')
('A', 'b', 'c')
('a', 'B', 'C')
('a', 'B', 'c')
('a', 'b', 'C')
('a', 'b', 'c')
Run Code Online (Sandbox Code Playgroud)

说明:

要求生成f每个项目LfL

>>> fL
['a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)

用于zip将两个列表压缩成对

>>> zip(L, fL)
[('A', 'a'), ('B', 'b'), ('C', 'c')]
Run Code Online (Sandbox Code Playgroud)

使用那些元组的笛卡尔积 itertools.product

product(*zip(L, fL))
Run Code Online (Sandbox Code Playgroud)

相当于

product(*[('A', 'a'), ('B', 'b'), ('C', 'c')])
Run Code Online (Sandbox Code Playgroud)

这相当于

product(('A', 'a'), ('B', 'b'), ('C', 'c'))
Run Code Online (Sandbox Code Playgroud)

循环使用该产品,可以提供我们所需的结果.

  • 这是有效的,但它比必要的更多地计算`f`,这可能是一个问题,这取决于`f`有多贵. (2认同)