Python - выполнение всех перестановок списка функций - PullRequest
0 голосов
/ 20 апреля 2020

Я хочу выполнить все перестановки в списке функций, как частичные, так и полные, добавить результаты и поместить их в список. Например, скажем, у меня есть три функции:

foo():
 return 1

bar():
 return 2

bat():
 return 3

Я хочу выполнить foo(), bar(), bat(), foo() bar(), foo() bat() bar() bat() и foo() bar() bat().

Следовательно, результирующий список будет выглядеть следующим образом: [1, 2, 3, 3, 4, 5, 6].

Есть идеи, как я могу вызвать все эти функции? В действительности у меня будет около 50 функций, и я хочу записать все комбинации всех функций.

Спасибо за любую помощь, которую вы оказываете.

Ответы [ 3 ]

1 голос
/ 20 апреля 2020

Я предполагаю, что вы хотите, чтобы функции вызывались снова для каждой вычисленной суммы, то есть не вычислять результаты функции только один раз, а затем вычислять суммы их результатов.

Мне кажется, что самый чистый подход:

from itertools import combinations


def foo():
    return 1


def bar():
    return 2


def bat():
    return 3


x = [foo, bar, bat]

# literally the list of sums of function results, 
# for functions from all combinations of any length > 0 from x
result = [sum([f() for f in t]) for n in range(len(x)) for t in combinations(x, n+1)]
print(result)

Выход:

[1, 2, 3, 3, 4, 5, 6]
1 голос
/ 20 апреля 2020

Знаете ли вы, что вы можете хранить функции в списках в Python?

Сначала вы можете определить все свои функции:

def foo():
    return 1

def bar():
    return 2

def bat():
    return 3

Затем создайте список, содержащий все их:

list_of_functions = [foo, bar, bat]

Теперь вы можете использовать itertools.combination, чтобы делать то, что вы хотите:

from itertools import combinations

res_list = []

for i in range(len(list_of_functions)):
    comb_list = list(combinations(list_of_functions, i+1))
    for combination in comb_list:
        x = sum(e() for e in combination)
        res_list.append(x)

print(res_list)
0 голосов
/ 20 апреля 2020

Позже редактировать:

from itertools import chain, combinations

l = [foo, bar, bat]

[sum(j() for j in z) for z in chain.from_iterable(([y for y in x] for x in combinations(l, r)) for r in range(1,len(l)+1))]
...