Улучшение Itertools - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь найти все комбинации элементов длиной от 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
...