I construct a string s in Python 2.6.5 which will have a varying number of %s tokens, which match the number of entries in list x. I need to write out a formatted string. The following doesn't work, but indicates what I'm trying to do. In this example, there are three %s tokens and the list has three entries.

s = '%s BLAH %s FOO %s BAR' x = ['1', '2', '3'] print s % (x) 

I'd like the output string to be:

1 BLAH 2 FOO 3 BAR

0

8 Answers

You should take a look to the format method of python. You could then define your formatting string like this :

>>> s = '{0} BLAH BLAH {1} BLAH {2} BLAH BLIH BLEH' >>> x = ['1', '2', '3'] >>> print s.format(*x) '1 BLAH BLAH 2 BLAH 3 BLAH BLIH BLEH' 
8
print s % tuple(x) 

instead of

print s % (x) 
7

Following this resource page, if the length of x is varying, we can use:

', '.join(['%.2f']*len(x)) 

to create a place holder for each element from the list x. Here is the example:

x = [1/3.0, 1/6.0, 0.678] s = ("elements in the list are ["+', '.join(['%.2f']*len(x))+"]") % tuple(x) print s >>> elements in the list are [0.33, 0.17, 0.68] 
0

Here is a one liner. A little improvised answer using format with print() to iterate a list.

How about this (python 3.x):

sample_list = ['cat', 'dog', 'bunny', 'pig'] print("Your list of animals are: {}, {}, {} and {}".format(*sample_list)) 

Read the docs here on using format().

2

Since I just learned about this cool thing(indexing into lists from within a format string) I'm adding to this old question.

s = '{x[0]} BLAH {x[1]} FOO {x[2]} BAR' x = ['1', '2', '3'] print (s.format (x=x)) 

Output:

1 BLAH 2 FOO 3 BAR 

However, I still haven't figured out how to do slicing(inside of the format string '"{x[2:4]}".format...,) and would love to figure it out if anyone has an idea, however I suspect that you simply cannot do that.

2

This was a fun question! Another way to handle this for variable length lists is to build a function that takes full advantage of the .format method and list unpacking. In the following example I don't use any fancy formatting, but that can easily be changed to suit your needs.

list_1 = [1,2,3,4,5,6] list_2 = [1,2,3,4,5,6,7,8] # Create a function that can apply formatting to lists of any length: def ListToFormattedString(alist): # Create a format spec for each item in the input `alist`. # E.g., each item will be right-adjusted, field width=3. format_list = ['{:>3}' for item in alist] # Now join the format specs into a single string: # E.g., '{:>3}, {:>3}, {:>3}' if the input list has 3 items. s = ','.join(format_list) # Now unpack the input list `alist` into the format string. Done! return s.format(*alist) # Example output: >>>ListToFormattedString(list_1) ' 1, 2, 3, 4, 5, 6' >>>ListToFormattedString(list_2) ' 1, 2, 3, 4, 5, 6, 7, 8' 

The same as @neobot's answer but a little more modern and succinct.

>>> l = range(5) >>> " & ".join(["{}"]*len(l)).format(*l) '0 & 1 & 2 & 3 & 4' 
x = ['1', '2', '3'] s = f"{x[0]} BLAH {x[1]} FOO {x[2]} BAR" print(s) 

The output is

1 BLAH 2 FOO 3 BAR