>>> 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')
Объяснение:
Вызов f
для каждого элемента в L
для создания fL
>>> fL
['a', 'b', 'c']
Используйте zip
застегнуть два списка в пар
>>> zip(L, fL)
[('A', 'a'), ('B', 'b'), ('C', 'c')]
Возьмите декартово произведение этих кортежей с помощью itertools.product
product(*zip(L, fL))
эквивалентно
product(*[('A', 'a'), ('B', 'b'), ('C', 'c')])
и что эквивалентно
product(('A', 'a'), ('B', 'b'), ('C', 'c'))
цикл над этим продуктом, дает точно нужный нам результат.
+1 ... Проклятье, это то, что я имел в виду, но не мог это кодировать ... Sigh .... – thefourtheye
Это работает, но он вычисляет 'f' намного больше, чем необходимо, что может быть проблема в зависимости от того, насколько дорогой 'f'. – user2357112
@ user2357112, см. Мое редактирование, адресованное этому –