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)
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
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)
Method 2
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.
Method 3
You can use the dictionary type of formatting:
s='arbit'
string='%(key)s hello world %(key)s hello world %(key)s' % {'key': s,}
Method 4
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,))
Method 5
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.
Method 6
>>> s1 ='arbit' >>> s2 = 'hello world '.join( [s]*3 ) >>> print s2 arbit hello world arbit hello world arbit
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0