Объединение 2 списков продуктов itertools для большей комбинации, чтобы найти все комбинации - PullRequest
0 голосов
/ 19 июня 2019

В основном я пытаюсь уменьшить количество комбинаций, используя itertools.product, но получаю все комбинации из 4 элементов, используя 2 списка.

Я могу создать 2 отдельных списка комбинаций элементов, но не могувыяснить, как объединить 2 списка, получая все их комбинации.

import itertools
pos_vars = ('a', 'b')
pos_num = (1, 0.5, 0)
neg_vars = ('c', 'd')
neg_num = (-1, -0.5, 0)
pos = [list(zip(pos_vars, p)) for p in itertools.product(pos_num, repeat=2)]
print(pos)
[[('a', 1), ('b', 1)], [('a', 1), ('b', 0.5)], [('a', 1), ('b', 0)], [('a', 0.5), ('b', 1)], [('a', 0.5), ('b', 0.5)], [('a', 0.5), ('b', 0)], [('a', 0), ('b', 1)], [('a', 0), ('b', 0.5)], [('a', 0), ('b', 0)]]

neg = [list(zip(neg_vars, n)) for n in itertools.product(neg_num, repeat=2)]
print(neg)
[[('c', -1), ('d', -1)], [('c', -1), ('d', -0.5)], [('c', -1), ('d', 0)], [('c', -0.5), ('d', -1)], [('c', -0.5), ('d', -0.5)], [('c', -0.5), ('d', 0)], [('c', 0), ('d', -1)], [('c', 0), ('d', -0.5)], [('c', 0), ('d', 0)]]

Объединенный список из обоих списков должен выглядеть примерно так: [[('a', 1), ('b', 1), ('c', -1), ('d', -1)], [('a', 1), ('b', 1), ('c', -1), ('d', -0.5)], etc.]

Я могу получить полный диапазон, но я в основном удваиваю вычисления, которые я стараюсь избегатьследующий код:

full_var = ('a', 'b', 'c', 'd')
full_num = (-1, -0.5, 0, 0.5, 1)
full = [list(zip(full_var, f)) for f in itertools.product(full_num, repeat=4)]

Заранее спасибо!

Обновление - я смог получить свои 81 комбинацию.Не самое эффективное кодирование, но оно работает и может быть улучшено.

pos_a_var = ('a')
pos_b_var = ('b')
neg_c_var = ('c')
neg_d_var = ('d')
pos_num = (1, 0.5, 0)
neg_num = (-1, -0.5, 0)
pos_a = list(itertools.product(pos_a_var, pos_num))
pos_b = list(itertools.product(pos_b_var, pos_num))
neg_c = list(itertools.product(neg_c_var, neg_num))
neg_d = list(itertools.product(neg_d_var, neg_num))
comb_list = [pos_a, pos_b, neg_c, neg_d]
all_combinations = list(itertools.product(*comb_list))
len(all_combinations)
81

Все еще работаем над тем, чтобы сделать этот код немного чище.

1 Ответ

1 голос
/ 19 июня 2019

Может быть:

print([x + y for x, y in zip(pos, neg)])

Вывод:

[[('a', 1), ('b', 1), ('c', -1), ('d', -1)], [('a', 1), ('b', 0.5), ('c', -1), ('d', -0.5)], [('a', 1), ('b', 0), ('c', -1), ('d', 0)], [('a', 0.5), ('b', 1), ('c', -0.5), ('d', -1)], [('a', 0.5), ('b', 0.5), ('c', -0.5), ('d', -0.5)], [('a', 0.5), ('b', 0), ('c', -0.5), ('d', 0)], [('a', 0), ('b', 1), ('c', 0), ('d', -1)], [('a', 0), ('b', 0.5), ('c', 0), ('d', -0.5)], [('a', 0), ('b', 0), ('c', 0), ('d', 0)]]
...