Я пытаюсь найти все комбинации элементов длиной от 1 до размера (в примере size=5
) и что-то сделать с этими комбинациями: каждый элемент списка - это пара списков и другой список.Итак, я суммирую вторые элементы, а затем преобразовываю сумму первых списков в строку.
for i in itertools.combinations(functions, size):
sum = [0 for k in range(2 ** n)]
str1 = ""
for j in i:
if str1 != "":
str1 += "+"
sum = [sum[k] + j[1][k] for k in range(2 ** n)]
str1 += parseFunc(j[0])
sum = [sum[k] % 2 for k in range(2 ** n)]
value=sum, str1, size
count += 1
f_out.write(str(size)+" "+str(sum)+" :"+str1+"\n")
def parseFunc(func):
str1=""
for i in range(len(func)):
if func[i] == 0:
continue
if func[i] == 1:
str1 += "x" + str(i)
if func[i] == -1:
str1 += "!x" + str(i)
if str1!="":
return str1
else:
return "1"
Так, например, если функция [1] и функция [2] находятся в комбинации, я вычисляю их сумму для каждой комбинациигде они.
Это слишком сложно для больших чисел, потому что функция [i] [1] может содержать 32 или более элементов.Есть ли какие-то короткие способы, чтобы сделать вычисления лучше, не суммируя одни и те же части комбинации много раз?
Вот пример входных данных для функций:
functions=[[[(0, 0), [1, 1, 1, 1]], [(0, 1), [0, 1, 0, 1]], [(1, 0), [0, 0, 1, 1]], [(1, 1), [0, 0, 0, 1]]], [[(0, 0), [1, 1, 1, 1]], [(0, -1), [1, 0, 1, 0]], [(1, 0), [0, 0, 1, 1]], [(1, -1), [0, 0, 1, 0]]], [[(0, 0), [1, 1, 1, 1]], [(0, 1), [0, 1, 0, 1]], [(-1, 0), [1, 1, 0, 0]], [(-1, 1), [0, 1, 0, 0]]], [[(0, 0), [1, 1, 1, 1]], [(0, -1), [1, 0, 1, 0]], [(-1, 0), [1, 1, 0, 0]], [(-1, -1), [1, 0, 0, 0]]]]
n=2