📜  opslist = {operator.add: “+”, operator.sub: “-”, operator.mul: “x”} - 任何代码示例

📅  最后修改于: 2022-03-11 14:56:01.448000             🧑  作者: Mango

代码示例1
import operator
from itertools import product
from itertools import permutations

NUMBER_OF_OPERATIONS_IN_SOLUTION = 2 #Total numbers involved is this plus 1
NUMBER_OF_NUMBERS_IN_SOLUTION = NUMBER_OF_OPERATIONS_IN_SOLUTION + 1
TARGET_VALUES = {22,27,29,38,39}

def getresults(listofnums):
    #Add the cartesian product of all possible operations to a variable ops
    ops = []
    opslist = [operator.add, operator.sub, operator.mul, operator.truediv]
    for val in product(opslist, repeat=NUMBER_OF_OPERATIONS_IN_SOLUTION):
        ops.append(val)

    #Get the result set of all combinations of numbers and cartesian products of operations that reach a target_value
    results = []
    for x in permutations(listofnums, NUMBER_OF_NUMBERS_IN_SOLUTION):
        for y in ops:
            result = y[0](x[0], x[1])
            if NUMBER_OF_OPERATIONS_IN_SOLUTION>1:
                for z in range(1, len(y)):
                    result = y[z](result, x[z+1])
            if result in TARGET_VALUES:
                results.append([x, y, result])
    return results

def getalpha(string, inverse):
    "Converts string to alphanumeric array of chars"
    array = []
    for i in range(0, len(string)): 
        alpha = ord(string[i]) - 96
        array.append(27-alpha if inverse else alpha)
    return array

class Person:
    def __init__(self, name, middlename, birthmonth, birthday, birthyear, age, orderofbirth, gradyear, state, zipcode, workzip, cityfirst3):
        #final list
        self.listofnums = [birthmonth, birthday, birthyear, birthyear - 1900, age, orderofbirth, gradyear, gradyear - 2000, zipcode, workzip]
        self.listofnums.extend(getalpha(cityfirst3, False))
        self.results = getresults(self.listofnums)

#Check every result in sibling2 with a different result target_value and equal operation sets
def comparetwosiblings(current_values, sibling1, sibling2, a, b):
    if sibling2.results[b][2] not in current_values and sibling1.results[a][1]==sibling2.results[b][1]:
        okay = True
        #If the indexes aren't alphanumeric, ensure they're the same before adding to new result set
        for c in range(0, NUMBER_OF_NUMBERS_IN_SOLUTION):
            indexintersection = set([index for index, value in enumerate(sibling1.listofnums) if value == sibling1.results[a][0][c]]) & set([index for index, value in enumerate(sibling2.listofnums) if value == sibling2.results[b][0][c]])
            if len(indexintersection) > 0:
                okay = True
            else:
                okay = False
                break
    else:
        okay = False
    return okay