If you are married to the idea of pushing values into a list and evaluating the list there is a fairly easy way to do this.
# Here's your list
a = ['23', '*', '2', '+' '(', '5', '-', '2', ')']
# Let's turn that list into a string
b=" ".join(a)
# Let's see what it looks like
print b
>>>'23 * 2 +( 5 - 2 )'
# Let's evaluate it
c = eval(b)
# is it right?
print c
>>>49
Now there are some issues here right? And that's why I would say that most calculator programs don't function in this way. What if I enter in a super long string of things into my list that don't work?
a = ['22', '23', '+', '46']
Doing the process above will fail because what does 22 23 + 46 even mean right? Most simple calculator apps do something to validate input. My first recommendation would be to start with a reverse polish notation calculator. Here you would input something like:
34 26 +
And this might seem weird but from a programming perspective it's actually a bit easier(namely because you can implement order of operations without parens. You might also try to validate input to the calculator as it is coming in. if a user enters 2 numbers in a row, what should happen? if a user forgets a closed parenthesis what should happen? It's not enough in an app like this to give the correct answer when the input is perfect, rather it's important to fail gracefully and make sure minor errors don't make the user unhappy.
I think it's also valuable to consider if it's worth keeping the entire function around in a list. What if I have a 300 number function that was input and I made a mistake in the first number? What if somehow you end up with a several thousand number function? (Unlikely but worth considering as a mental exercise.) Is it worth keeping around:
(1 + 1) + (1 + 1) + (1 + 1) ..........
When you could be evaluating as the data is input?