134

I have a string of this form

s='arbit'
string='%s hello world %s hello world %s' %(s,s,s)

All the %s in string have the same value (i.e. s). Is there a better way of writing this? (Rather than listing out s three times)

8
  • Duplicate: stackoverflow.com/questions/543399/python-string-formatting Commented Mar 23, 2010 at 13:07
  • 3
    This % string operator will be "deprecated on Python 3.1 and removed later at some time" docs.python.org/release/3.0.1/whatsnew/… now I wonder what is the most advised way for both version compatibility and security. Commented Apr 30, 2010 at 0:34
  • 2
    @Cawas I know this is pretty late, but I like using str.format(). Ex.: query = "SELECT * FROM {named_arg}"; query.format(**kwargs), where query is the format string and kwargs is a dictionary with keys matching the named_args in the format string. Commented May 14, 2012 at 2:36
  • 4
    @Cawas Yeah, except Adam used tuple notation, where {0}, {1}, {2} and so on correspond to tuple indices 0, 1, and 2, respectively. Alternatively, it's also possible to name the args (like {named_arg}) and set each one in the format method, like so: 'Hi {fname} {lname}!'.format(fname='John', lname='Doe') Commented May 16, 2012 at 4:07
  • 2
    @bignose You have marked both questions duplicates of one another its like google.com/… Commented Apr 11, 2013 at 9:48

6 Answers 6

235

You can use advanced string formatting, available in Python 2.6 and Python 3.x:

incoming = 'arbit'
result = '{0} hello world {0} hello world {0}'.format(incoming)
Sign up to request clarification or add additional context in comments.

1 Comment

~my personal preference, go for kwargs style result = '{st} hello world {st} hello world {st}'.format(st=incoming)
50
incoming = 'arbit'
result = '%(s)s hello world %(s)s hello world %(s)s' % {'s': incoming}

You may like to have a read of this to get an understanding: String Formatting Operations.

5 Comments

Nice. Had forgotten about this. locals() will do as well.
@Goutham: Adam Rosenfield's answer might be better if you're Python version is up to date.
It is actually. Iam still getting used to the new string formatting operations.
even better, you can multuply the base string: '%(s)s hello world '*3 % {'s': 'asdad'}
s is missleading as variable name here and don't forget that the 's' or another formatting option (d, d03, ...) is manadatory after the %(<field-name>) pattern. '%(s) hello' doesn't work '%(s)s hello' does.
18

You can use the dictionary type of formatting:

s='arbit'
string='%(key)s hello world %(key)s hello world %(key)s' % {'key': s,}

Comments

13

Depends on what you mean by better. This works if your goal is removal of redundancy.

s='foo'
string='%s bar baz %s bar baz %s bar baz' % (3*(s,))

Comments

4

Fstrings

If you are using Python 3.6+ you can make use of the new so called f-strings which stands for formatted strings and it can be used by adding the character f at the beginning of a string to identify this as an f-string.

price = 123
name = "Jerry"
print(f"{name}!!, {price} is much, isn't {price} a lot? {name}!")
>Jerry!!, 123 is much, isn't 123 a lot? Jerry!

The main benefits of using f-strings is that they are more readable, can be faster, and offer better performance:

Source Pandas for Everyone: Python Data Analysis, By Daniel Y. Chen

Benchmarks

No doubt that the new f-strings are more readable, as you don't have to remap the strings, but is it faster though as stated in the aformentioned quote?

price = 123
name = "Jerry"

def new():
    x = f"{name}!!, {price} is much, isn't {price} a lot? {name}!"


def old():
    x = "{1}!!, {0} is much, isn't {0} a lot? {1}!".format(price, name)

import timeit
print(timeit.timeit('new()', setup='from __main__ import new', number=10**7))
print(timeit.timeit('old()', setup='from __main__ import old', number=10**7))
> 3.8741058271543776  #new
> 5.861819514350163   #old

Running 10 Million test's it seems that the new f-strings are actually faster in mapping.

Comments

2
>>> s1 ='arbit'
>>> s2 = 'hello world '.join( [s]*3 )
>>> print s2
arbit hello world arbit hello world arbit

1 Comment

I guess that the example in the question was not about 'hello world' repeated, but a real template with no duplication. That's why I downvoted.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.