0

I'm able to sum up the value of each True statement per row, but I can't get it to print in a column format next to the result.

 `res = eval(exp)  # evaluate the logical input from the user
 print(res)  # this prints the result of the logical expression in a column format`

This section of the code evaluates my logical expression from the user input and prints the True/False result in a column format as desired. However, I can't figure out how to display my sum of each row's Truth value in the same format. Underneath this code I sum up each row of the truth table, but can only get it to print at the bottom of my result. Below is how I am summing up each row.

   `try:
    res = eval(exp)  # evaluate the logical input from the user
    print(res)  # this prints the result of the logical expression in a column format

        truth_sum = []  # I create this list
        for row in truth_table:  # I parse the each row in the truth table
            truth_sum.append(sum(row))  # and sum up each True statement
    except:
        print("Wrong Expression")
print(*truth_sum, sep="\n")  # This line is my problem.  I can't figure how to print this next to each result
print()`

If I place the print(*truth_sum, sep="\n")above the except: it prints it out after each Truth Table row. How would I get the sum list to print out next to the logical expression column? Here is my complete code for better understanding.

`import itertools
truth_table = 0
val = 0
exp = ''
p1 = 0
p2 = 0
p3 = 0
p4 = 0
p5 = 0
p6 = 0
pos = 0


# This function takes care of taking users input
def get_input():
    global val
    while True:
        try:
            val = int(input("Please Enter the number of parameters, 1 - 5: "))
            if val < 1 or val > 5:
            print(f"Enter a value [0,6)")
        else:
            break
        except ValueError:
            print(f"Only Numbers are Allowed, Try Again..")


# This function takes care of the Truth Table header
def table_header():
    print("========================TRUTH TABLE===============================")
    print("p1\t\t\tp2\t\t\tp3\t\t\tp4\t\t\tp5")
    print("*" * 20 * val)


# This is the Main method
def main():
    # Global Variables
    global val
    global truth_table
    global exp
    global p1
    global p2
    global p3
    global p4
    global p5
    global pos

    # Call the userInput Function
    get_input()

    # Creating the truth table
    truth_table = list(itertools.product([True, False], repeat=val))
    exp = input("Enter a Logical Statement i.e [(p1 and p2) or p3]: [p1==p2==p3==...Pn:]:").lower()

    # printing Table Layout
    table_header()
    for par in truth_table:
        pos = 0
        if val == 1:
            p1 = par[0]
        elif val == 2:
            p1, p2 = par[0], par[1]
        elif val == 3:
            p1, p2, p3 = par[0], par[1], par[2]
        elif val == 4:
            p1, p2, p3, p4 = par[0], par[1], par[2], par[3]
        else:
            p1, p2, p3, p4, p5 = par[0], par[1], par[2], par[3], par[4]
            pos = 0
        while pos < val:
            print(par[pos], end='\t\t')
            pos = pos + 1
        try:
            res = eval(exp)  # evaluate the logical input from the user
            print(res)  # this prints the result of the logical expression in a column format

            truth_sum = []  # I create this list
            for row in truth_table:  # I parse the each row in the truth table
                truth_sum.append(sum(row))  # and sum up each True statement
        except:
            print("Wrong Expression")
    print(*truth_sum, sep="\n")  # This line is my problem.  I can't figure how to print this next to 
                                   each result
    print()


if __name__ == "__main__":
    main()` 

Here is an example of my output.

`Please Enter the number of parameters, 1 - 5: 2
Enter a Logical Statement i.e [(p1 and p2) or p3]: [p1==p2==p3==...Pn:]:p1 and p2
========================TRUTH TABLE===============================
p1          p2          p3          p4          p5
****************************************
True        True        True
True        False       False
False       True        False
False       False       False
2
1
1
0`

How do I get this sum list of each row of True values to display next to the logical expression result instead of at the bottom?

  • 2
    First rule of python club, never eval user input........second rule of python club......NEVER EVAL USER INPUT. you could literally be executing any code here. I know you might say oh but i know only nice stuff will be typed. But you should try to get out of this habit. or at least sanitise and validate the user input before you eval it – Chris Doyle Mar 14 '20 at 21:15
  • Understood. However, this will only be used by me. I am new to Python and despite how bad the code is was the only way I could figure out how to create the truth table. – RyBoneCoder Mar 14 '20 at 21:20
  • I can't spot the part of the code that prints the actual truth table (i.e. the `True/False` objects). Wherever that is, you can just append the sum to it (or prepend). – a_guest Mar 14 '20 at 21:31
  • The "truth_table = list(itertools.product([True, False], repeat=val))" gives the truth table and "for par in truth_table:" what ever value is entered for truth table size it creates that size variable truth table – RyBoneCoder Mar 14 '20 at 22:12

1 Answers1

0

I've written here the version of the code I'd write for this task avoiding the eval() method (as suggested by Chris Doyle) and adopting the main idea of saving the data in RAM before to print anything. In this way you can then print it as you prefer.

The following code is "minimized" in order to be understood. Therefore some stuff is not included (e.g. the table header). Anyway you can add it then easily.

import itertools

# Hard-coded expression to evaluate the parameters of the truth table
EXPRESSION = lambda array: array[0] and array[1]
PARAMETERS_NUMBER = 2
# function to count the total number of true in a row
TRUE_COUNTER = lambda array: sum([int(x==True) for x in array])

truth_table = list(itertools.product([True, False], repeat=PARAMETERS_NUMBER))

# array with the result of the truth table for each row
results = [EXPRESSION(row) for row in truth_table]
# array with the number of true for each parameter row
true_numbers = [TRUE_COUNTER(row) for row in truth_table]

# print the table
for row, result, true_number in zip(truth_table, results, true_numbers):
    print(row, result, true_number, "\n")

Let me know if it is enough clear and useful for your task.

Wai Ha Lee
  • 8,598
  • 83
  • 57
  • 92
debiandado
  • 46
  • 3