richid
richid

Reputation: 650

Python string interpolation using dictionary and strings

Given:

dict = {"path": "/var/blah"}
curr = "1.1"
prev = "1.0"

What's the best/shortest way to interpolate the string to generate the following:

path: /var/blah curr: 1.1 prev: 1.0

I know this works:

str = "path: %(path)s curr: %(curr)s prev: %(prev)s" % {"path": dict["path"],"curr": curr, "prev": prev}

But I was hoping there is a shorter way, such as:

str = "path: %(path)s curr: %s prev: %s" % (dict, curr, prev)

My apologies if this seems like an overly pedantic question.

Upvotes: 25

Views: 47821

Answers (8)

gaborous
gaborous

Reputation: 16610

You can also (soon) use f-strings in Python 3.6, which is probably the shortest way to format a string:

print(f'path: {path} curr: {curr} prev: {prev}')

And even put all your data inside a dict:

d = {"path": path, "curr": curr, "prev": prev}
print(f'path: {d["path"]} curr: {d["curr"]} prev: {d["prev"]}')

Upvotes: 8

Colonel Panic
Colonel Panic

Reputation: 137712

Update 2016: As of Python 3.6 you can substitute variables into strings by name:

>>> origin = "London"
>>> destination = "Paris"
>>> f"from {origin} to {destination}"
'from London to Paris'

Note the f" prefix. If you try this in Python 3.5 or earlier, you'll get a SyntaxError.

See https://docs.python.org/3.6/reference/lexical_analysis.html#f-strings

Upvotes: 3

Troy Fletcher
Troy Fletcher

Reputation: 58

If you don't want to add the unchanging variables to your dictionary each time, you can reference both the variables and the dictionary keys using format:

str = "path {path} curr: {curr} prev: {prev}".format(curr=curr, prev=prev, **dict)

It might be bad form logically, but it makes things more modular expecting curr and prev to be mostly static and the dictionary to update.

Upvotes: 1

Bemis
Bemis

Reputation: 3382

You can do the following if you place your data inside a dictionary:

data = {"path": "/var/blah","curr": "1.1","prev": "1.0"}

"{0}: {path}, {1}: {curr}, {2}: {prev}".format(*data, **data)

Upvotes: 5

monkut
monkut

Reputation: 43860

And of course you could use the newer (from 2.6) .format string method:

>>> mydict = {"path": "/var/blah"}
>>> curr = "1.1"
>>> prev = "1.0"
>>>
>>> s = "path: {0} curr: {1} prev: {2}".format(mydict['path'], curr, prev)
>>> s
'path: /var/blah curr: 1.1 prev: 1.0'   

Or, if all elements were in the dictionary, you could do this:

>>> mydict = {"path": "/var/blah", "curr": 1.1, "prev": 1.0}
>>> "path: {path} curr: {curr} prev: {prev}".format(**mydict)
'path: /var/blah curr: 1.1 prev: 1.0'
>>>

From the str.format() documentation:

This method of string formatting is the new standard in Python 3.0, and should be preferred to the % formatting described in String Formatting Operations in new code.

Upvotes: 29

Kenan Banks
Kenan Banks

Reputation: 212088

You can try this:

data = {"path": "/var/blah",
        "curr": "1.1",
        "prev": "1.0"}

s = "path: %(path)s curr: %(curr)s prev: %(prev)s" % data

Upvotes: 57

Alex Martelli
Alex Martelli

Reputation: 882391

Why not:

mystr = "path: %s curr: %s prev: %s" % (mydict[path], curr, prev)

BTW, I've changed a couple names you were using that trample upon builtin names -- don't do that, it's never needed and once in a while will waste a lot of your time tracking down a misbehavior it causes (where something's using the builtin name assuming it means the builtin but you have hidden it with the name of our own variable).

Upvotes: 18

hughdbrown
hughdbrown

Reputation: 49033

Maybe:

path = dict['path']
str = "path: %(path)s curr: %(curr)s prev: %(prev)s" % locals()

I mean it works:

>>> dict = {"path": "/var/blah"}
>>> curr = "1.1"
>>> prev = "1.0"
>>> path = dict['path']
>>> str = "path: %(path)s curr: %(curr)s prev: %(prev)s" % locals()
>>> str
'path: /var/blah curr: 1.1 prev: 1.0'

I just don't know if you consider that shorter.

Upvotes: 13

Related Questions