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)
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)
result = '{st} hello world {st} hello world {st}'.format(st=incoming)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.
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
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.
>>> s1 ='arbit'
>>> s2 = 'hello world '.join( [s]*3 )
>>> print s2
arbit hello world arbit hello world arbit
%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.str.format(). Ex.:query = "SELECT * FROM {named_arg}"; query.format(**kwargs), wherequeryis the format string andkwargsis a dictionary with keys matching thenamed_args in the format string.{0},{1},{2}and so on correspond to tuple indices0,1, and2, 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')