Python string interpolation using dictionary and strings

自古美人都是妖i 提交于 2019-12-03 19:03:35

问题


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.


回答1:


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).




回答2:


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



回答3:


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.




回答4:


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.




回答5:


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"]}')



回答6:


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)



回答7:


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




回答8:


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.



来源:https://stackoverflow.com/questions/1304025/python-string-interpolation-using-dictionary-and-strings

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!