Ah, but you can "format against list":
In [4]: '%s' % [1,2] Out[4]: '[1, 2]'
The string interpolator % can be accompanied by either a single non-tuple or a tuple.
If it is a tuple, the arguments are unpacked and matched with placeholders in the strings. If the object is the only object not associated with the tuple, then the entire object is passed to the placeholder in the string.
This somewhat manic behavior is part of what prompted Python developers to introduce a syntactically cleaner str.format method.
Also from PEP 3101 :
The operator "%" is mainly limited in that it is a binary operator and, therefore, can take no more than two arguments. One of these arguments has already been allocated for the format string, leaving all other variables to fit into the remaining argument. Current practice is to use either a dictionary or a tuple as the second argument, but as many people have commented, this has no flexibility. The all-or-nothing approach (meaning that you have to choose between only positional arguments, or only named arguments) is considered overly limited.
source share