1

I am trying to print a table of values of a function. If X is 1 then Y would be something like 4, so in a Column all X values and in Y all the solutions. For this. I am using an eval that solves the string equation, the program asks for number of range for X, named as "RANGO". Then it sums x + 1 and calculates the eval, then, again, until the loop is finished within the range. The problem is, the dictionary its created well, but, in the tabulate, it inserts the RAW Data of the Dictionary. So here is how my program looks right now:

import re
from tabulate import tabulate

def funcion():
  
 while True:
   global funcion
   
   funcion = input("Introduce una Funcion. ")
   
   if re.match('.[a-zA-Z].' ,funcion) and not re.match("[x1-9]", funcion):
    print("Incorrecto, contiene una letra")
     
   elif "x" not in funcion:
      print("No contiene la X necesaria en una funcion: ")
     
   else: 
     rango = int(input("Introduce la cantidad de valores de Y que quieres sacar: "))
     
     if re.match("(\d+)x", funcion):
      funciont = re.sub(r'(x)', r'*\1', funcion)
      for x in range(rango):
          x = x + 1
          print(eval(funciont), "= Y", "x = ",x)
        
     else: #CREO LOS DICCIONARIOS
      s = {}
      r = {}
      for x in range(rango): #PARA X EN RANGO ESPECIFICADO,SE SUMA 1
       x = x + 1 #SE DEFINE X EN CADA CICLO, MAS UNO
       s["{0}".format(x)] = eval(funcion)
       r["{0}".format(x)] = x
       print(x)
      break
#CON DARLE VALOR A X EL EVAL AUTO CAMBIA X POR EL VALOR DE ELLA.
 global tabla
 tabla = [["Val Y", "Val X"],[s, r]]
 print(tabulate(tabla, headers='firstrow', tablefmt='fancy_grid'))
 
 
funcion()    

As you can see, the tabulate looks like this: TABLE

And I want it to look like this:

╒══════════════╤═══════════════╕
│ X            │       y       │
╞══════════════╪═══════════════╡
│ 1            │         6     │
├──────────────┼───────────────┤
│ 2            │          12   │
├──────────────┼───────────────┤
│ 3            │         18    │
├──────────────┼───────────────┤
│ 4            │          24   │
╘══════════════╧═══════════════╛
Felix Caba
  • 13
  • 3

1 Answers1

0

tabulate needs list

tabula = [ ['X', 'Y'], [1, 6], [2, 12], [3, 18], [4, 24] ]

Instead of dictionaries r,s you could use normal list to keep rows with [x, y]

rows = []

and later use

rows.append([x, eval(funcion)])

and finally create table

tabla = [ ["Val Y", "Val X"] ] + rows

Full working example:

import re
from tabulate import tabulate

def funcion():

    rows = []
    
    while True:
  
        #func = input("Introduce una Funcion. ")
        func = 'x * 6'
        print(' func:', func)
        
        if re.match('.[a-zA-Z].', func) and not re.match("[x1-9]", func):
            print("Incorrecto, contiene una letra")
         
        elif "x" not in func:
            print("No contiene la X necesaria en una funcion: ")
         
        else: 
            #rango = int(input("Introduce la cantidad de valores de Y que quieres sacar: "))
            rango = 5
            print('rango:', rango)
            
            if re.match("(\d+)x", func):
                func = re.sub(r'(x)', r'*\1', func)
                for x in range(1, rango+1):
                    print(eval(func), "= Y", "x =", x)
            
            else:
                for x in range(1, rango+1):
                    rows.append([x, eval(func)])
                break

    tabla = [["X", "Y"],] + rows
 
    print(tabulate(tabla, headers='firstrow', tablefmt='fancy_grid'))
 
# --- execute ---

funcion()

Result:

 func: x * 6
rango: 5
╒═════╤═════╕
│   X │   Y │
╞═════╪═════╡
│   1 │   6 │
├─────┼─────┤
│   2 │  12 │
├─────┼─────┤
│   3 │  18 │
├─────┼─────┤
│   4 │  24 │
├─────┼─────┤
│   5 │  30 │
╘═════╧═════╛

EDIT:

If you need r,s for other calculations then you can convert to rows using:

rows = []

for x, y in zip(r.values(), s.values()):
    rows.append( [x, y] )
furas
  • 134,197
  • 12
  • 106
  • 148