There are a few issues with what you are trying to do here, firstly lets look at what the tuple would look like:
>>> columns = ['a','b','c']
>>> tuple(columns)
('a', 'b', 'c')
>>>
As you can see the tuple will contain the same number of elements as your list, but in your query you on have a single %s. Hence the column count issue. Secondly if you added the correct number of %s the cursor would translate the elements to strings and escape them:
>>> cur.execute("SELECT %s,%s,%s FROM a", tuple(columns))
2L
>>> cur.fetchall()
(('a', 'b', 'c'), ('a', 'b', 'c'))
>>>
And you would receive the literals back as values and not column names as expected. I don't believe in this instance using the parameter option is going to be able to produce the results you expect.
A possible way would be to create your query using standard string methods:
>>> query = "SELECT %s FROM a" % ",".join(columns)
>>> query
'SELECT a,b,c FROM a'
>>>
And then pass this query to the cursor.