0

我正在编写代码以查找所有类似于"a&b|c!d|a"的输入的所有可能解决方案,其中a,b,c,d都是布尔值和& - and,| - or! - not是运营商。通过解决方案,我的意思是这些变量的值的集合,这使得输入表达式给出TruePython,无法从递归函数追加到列表

我能够打印所有可能的变量组合,但我无法保留它们(在这种情况下,在列表中)供以后使用。

我在做什么的方式有什么问题?有更好的方法来存储它们吗? generate_combination是我试图做到这一点的方法。

代码:

import operator 

# global all_combinations 
all_combinations=[] 
answers=[] 

def solve(combination, input, rank): 
    try: 
     substituted_str="" 
     for i in input: 
      if i in combination: 
       substituted_str+=combination[i] 
      else: 
       substituted_str+=i 
     print substituted_str 
     # for item in rank: 
    except: 
     pass 

def generate_combination(variables,comb_dict, length, current_index): 
    if len(comb_dict)==length: 
     print comb_dict #Each combination , coming out right 
     all_combinations.append(comb_dict) 
     print all_combinations,"\n" #This is not working as expected 
    else: 
     for i in [1,0]: 
      comb_dict[variables[current_index]]=i 
      generate_combination(variables,comb_dict, length,current_index+1) 
      comb_dict.pop(variables[current_index], None) 


def main(input,variables,order): 
    rank=sorted(order.items(), key=operator.itemgetter(1)) 

    generate_combination(variables, {}, len(variables), 0) 

    for combination in all_combinations: 
     print combination 
     ans=solve(combination, input, rank) 
     ans=[] 
     answers.extend(ans) 

    # for answer in answers: 
    #  print answer 

def nothing(): 
    pass 

if __name__ == '__main__': 
    # print "Enter your symbols for :\n" 
    # And=raw_input("And = ") 
    # Or=raw_input("Or = ") 
    # Not=raw_input("Not = ") 
    # input_str=raw_input("Enter the expression :") 

    And,Or,Not,input_str='&','|','!','a&b|c!d|a' 
    input_str=input_str.replace(" ","") 


    mapping={And:"&", Or:"|", Not:"!"} 
    order={"&":3, "|":2, "!":1} 


    variables=[] 
    processed_str="" 

    for i in input_str: 
     if i in mapping: 
      processed_str+=mapping[i] 
     else: 
      processed_str+=i 
      variables.append(i) 
    variables=list(set(variables)) 

    print "Reconstituted string : ",processed_str 
    print "Variables : ",variables,"\n" 

    main(processed_str,variables,order) 

电流输出:

Reconstituted string : a&b|c!d|a 
Variables : ['a', 'c', 'b', 'd'] 

{'a': 1, 'c': 1, 'b': 1, 'd': 1} 
[{'a': 1, 'c': 1, 'b': 1, 'd': 1}] 

{'a': 1, 'c': 1, 'b': 1, 'd': 0} 
[{'a': 1, 'c': 1, 'b': 1, 'd': 0}, {'a': 1, 'c': 1, 'b': 1, 'd': 0}] 

{'a': 1, 'c': 1, 'b': 0, 'd': 1} 
[{'a': 1, 'c': 1, 'b': 0, 'd': 1}, {'a': 1, 'c': 1, 'b': 0, 'd': 1}, {'a': 1, 'c': 1, 'b': 0, 'd': 1}] 

{'a': 1, 'c': 1, 'b': 0, 'd': 0} 
[{'a': 1, 'c': 1, 'b': 0, 'd': 0}, {'a': 1, 'c': 1, 'b': 0, 'd': 0}, {'a': 1, 'c': 1, 'b': 0, 'd': 0}, {'a': 1, 'c': 1, 'b': 0, 'd': 0}] 

{'a': 1, 'c': 0, 'b': 1, 'd': 1} 
[{'a': 1, 'c': 0, 'b': 1, 'd': 1}, {'a': 1, 'c': 0, 'b': 1, 'd': 1}, {'a': 1, 'c': 0, 'b': 1, 'd': 1}, {'a': 1, 'c': 0, 'b': 1, 'd': 1}, {'a': 1, 'c': 0, 'b': 1, 'd': 1}] 

{'a': 1, 'c': 0, 'b': 1, 'd': 0} 
[{'a': 1, 'c': 0, 'b': 1, 'd': 0}, {'a': 1, 'c': 0, 'b': 1, 'd': 0}, {'a': 1, 'c': 0, 'b': 1, 'd': 0}, {'a': 1, 'c': 0, 'b': 1, 'd': 0}, {'a': 1, 'c': 0, 'b': 1, 'd': 0}, {'a': 1, 'c': 0, 'b': 1, 'd': 0}] 

{'a': 1, 'c': 0, 'b': 0, 'd': 1} 
[{'a': 1, 'c': 0, 'b': 0, 'd': 1}, {'a': 1, 'c': 0, 'b': 0, 'd': 1}, {'a': 1, 'c': 0, 'b': 0, 'd': 1}, {'a': 1, 'c': 0, 'b': 0, 'd': 1}, {'a': 1, 'c': 0, 'b': 0, 'd': 1}, {'a': 1, 'c': 0, 'b': 0, 'd': 1}, {'a': 1, 'c': 0, 'b': 0, 'd': 1}] 

{'a': 1, 'c': 0, 'b': 0, 'd': 0} 
[{'a': 1, 'c': 0, 'b': 0, 'd': 0}, {'a': 1, 'c': 0, 'b': 0, 'd': 0}, {'a': 1, 'c': 0, 'b': 0, 'd': 0}, {'a': 1, 'c': 0, 'b': 0, 'd': 0}, {'a': 1, 'c': 0, 'b': 0, 'd': 0}, {'a': 1, 'c': 0, 'b': 0, 'd': 0}, {'a': 1, 'c': 0, 'b': 0, 'd': 0}, {'a': 1, 'c': 0, 'b': 0, 'd': 0}] 

{'a': 0, 'c': 1, 'b': 1, 'd': 1} 
[{'a': 0, 'c': 1, 'b': 1, 'd': 1}, {'a': 0, 'c': 1, 'b': 1, 'd': 1}, {'a': 0, 'c': 1, 'b': 1, 'd': 1}, {'a': 0, 'c': 1, 'b': 1, 'd': 1}, {'a': 0, 'c': 1, 'b': 1, 'd': 1}, {'a': 0, 'c': 1, 'b': 1, 'd': 1}, {'a': 0, 'c': 1, 'b': 1, 'd': 1}, {'a': 0, 'c': 1, 'b': 1, 'd': 1}, {'a': 0, 'c': 1, 'b': 1, 'd': 1}] 

{'a': 0, 'c': 1, 'b': 1, 'd': 0} 
[{'a': 0, 'c': 1, 'b': 1, 'd': 0}, {'a': 0, 'c': 1, 'b': 1, 'd': 0}, {'a': 0, 'c': 1, 'b': 1, 'd': 0}, {'a': 0, 'c': 1, 'b': 1, 'd': 0}, {'a': 0, 'c': 1, 'b': 1, 'd': 0}, {'a': 0, 'c': 1, 'b': 1, 'd': 0}, {'a': 0, 'c': 1, 'b': 1, 'd': 0}, {'a': 0, 'c': 1, 'b': 1, 'd': 0}, {'a': 0, 'c': 1, 'b': 1, 'd': 0}, {'a': 0, 'c': 1, 'b': 1, 'd': 0}] 

{'a': 0, 'c': 1, 'b': 0, 'd': 1} 
[{'a': 0, 'c': 1, 'b': 0, 'd': 1}, {'a': 0, 'c': 1, 'b': 0, 'd': 1}, {'a': 0, 'c': 1, 'b': 0, 'd': 1}, {'a': 0, 'c': 1, 'b': 0, 'd': 1}, {'a': 0, 'c': 1, 'b': 0, 'd': 1}, {'a': 0, 'c': 1, 'b': 0, 'd': 1}, {'a': 0, 'c': 1, 'b': 0, 'd': 1}, {'a': 0, 'c': 1, 'b': 0, 'd': 1}, {'a': 0, 'c': 1, 'b': 0, 'd': 1}, {'a': 0, 'c': 1, 'b': 0, 'd': 1}, {'a': 0, 'c': 1, 'b': 0, 'd': 1}] 

{'a': 0, 'c': 1, 'b': 0, 'd': 0} 
[{'a': 0, 'c': 1, 'b': 0, 'd': 0}, {'a': 0, 'c': 1, 'b': 0, 'd': 0}, {'a': 0, 'c': 1, 'b': 0, 'd': 0}, {'a': 0, 'c': 1, 'b': 0, 'd': 0}, {'a': 0, 'c': 1, 'b': 0, 'd': 0}, {'a': 0, 'c': 1, 'b': 0, 'd': 0}, {'a': 0, 'c': 1, 'b': 0, 'd': 0}, {'a': 0, 'c': 1, 'b': 0, 'd': 0}, {'a': 0, 'c': 1, 'b': 0, 'd': 0}, {'a': 0, 'c': 1, 'b': 0, 'd': 0}, {'a': 0, 'c': 1, 'b': 0, 'd': 0}, {'a': 0, 'c': 1, 'b': 0, 'd': 0}] 

{'a': 0, 'c': 0, 'b': 1, 'd': 1} 
[{'a': 0, 'c': 0, 'b': 1, 'd': 1}, {'a': 0, 'c': 0, 'b': 1, 'd': 1}, {'a': 0, 'c': 0, 'b': 1, 'd': 1}, {'a': 0, 'c': 0, 'b': 1, 'd': 1}, {'a': 0, 'c': 0, 'b': 1, 'd': 1}, {'a': 0, 'c': 0, 'b': 1, 'd': 1}, {'a': 0, 'c': 0, 'b': 1, 'd': 1}, {'a': 0, 'c': 0, 'b': 1, 'd': 1}, {'a': 0, 'c': 0, 'b': 1, 'd': 1}, {'a': 0, 'c': 0, 'b': 1, 'd': 1}, {'a': 0, 'c': 0, 'b': 1, 'd': 1}, {'a': 0, 'c': 0, 'b': 1, 'd': 1}, {'a': 0, 'c': 0, 'b': 1, 'd': 1}] 

{'a': 0, 'c': 0, 'b': 1, 'd': 0} 
[{'a': 0, 'c': 0, 'b': 1, 'd': 0}, {'a': 0, 'c': 0, 'b': 1, 'd': 0}, {'a': 0, 'c': 0, 'b': 1, 'd': 0}, {'a': 0, 'c': 0, 'b': 1, 'd': 0}, {'a': 0, 'c': 0, 'b': 1, 'd': 0}, {'a': 0, 'c': 0, 'b': 1, 'd': 0}, {'a': 0, 'c': 0, 'b': 1, 'd': 0}, {'a': 0, 'c': 0, 'b': 1, 'd': 0}, {'a': 0, 'c': 0, 'b': 1, 'd': 0}, {'a': 0, 'c': 0, 'b': 1, 'd': 0}, {'a': 0, 'c': 0, 'b': 1, 'd': 0}, {'a': 0, 'c': 0, 'b': 1, 'd': 0}, {'a': 0, 'c': 0, 'b': 1, 'd': 0}, {'a': 0, 'c': 0, 'b': 1, 'd': 0}] 

{'a': 0, 'c': 0, 'b': 0, 'd': 1} 
[{'a': 0, 'c': 0, 'b': 0, 'd': 1}, {'a': 0, 'c': 0, 'b': 0, 'd': 1}, {'a': 0, 'c': 0, 'b': 0, 'd': 1}, {'a': 0, 'c': 0, 'b': 0, 'd': 1}, {'a': 0, 'c': 0, 'b': 0, 'd': 1}, {'a': 0, 'c': 0, 'b': 0, 'd': 1}, {'a': 0, 'c': 0, 'b': 0, 'd': 1}, {'a': 0, 'c': 0, 'b': 0, 'd': 1}, {'a': 0, 'c': 0, 'b': 0, 'd': 1}, {'a': 0, 'c': 0, 'b': 0, 'd': 1}, {'a': 0, 'c': 0, 'b': 0, 'd': 1}, {'a': 0, 'c': 0, 'b': 0, 'd': 1}, {'a': 0, 'c': 0, 'b': 0, 'd': 1}, {'a': 0, 'c': 0, 'b': 0, 'd': 1}, {'a': 0, 'c': 0, 'b': 0, 'd': 1}] 

{'a': 0, 'c': 0, 'b': 0, 'd': 0} 
[{'a': 0, 'c': 0, 'b': 0, 'd': 0}, {'a': 0, 'c': 0, 'b': 0, 'd': 0}, {'a': 0, 'c': 0, 'b': 0, 'd': 0}, {'a': 0, 'c': 0, 'b': 0, 'd': 0}, {'a': 0, 'c': 0, 'b': 0, 'd': 0}, {'a': 0, 'c': 0, 'b': 0, 'd': 0}, {'a': 0, 'c': 0, 'b': 0, 'd': 0}, {'a': 0, 'c': 0, 'b': 0, 'd': 0}, {'a': 0, 'c': 0, 'b': 0, 'd': 0}, {'a': 0, 'c': 0, 'b': 0, 'd': 0}, {'a': 0, 'c': 0, 'b': 0, 'd': 0}, {'a': 0, 'c': 0, 'b': 0, 'd': 0}, {'a': 0, 'c': 0, 'b': 0, 'd': 0}, {'a': 0, 'c': 0, 'b': 0, 'd': 0}, {'a': 0, 'c': 0, 'b': 0, 'd': 0}, {'a': 0, 'c': 0, 'b': 0, 'd': 0}] 

回答

2

我认为问题是,在你的all_combinations列表中的所有项目都指向同一comb_dict ,则在每次调用g时覆盖每个元素enerate_combination。 尽量让comb_dict的副本:

all_combinations.append(comb_dict.copy())

+0

谢谢,这个问题解决了。我只是想知道,我从来没有面对过这个问题。 – Shivendra 2015-03-03 11:25:33

+0

@Shivendra我认为这是一个非常普遍的错误。很高兴有帮助! – JaviHerAr 2015-03-03 11:46:33