使用字典和字符串的Python字符串插值

ric*_*hid 20 python string string-interpolation

鉴于:

dict = {"path": "/var/blah"}
curr = "1.1"
prev = "1.0"
Run Code Online (Sandbox Code Playgroud)

插入字符串以生成以下内容的最佳/最短方法是什么:

路径:/ var/blah curr:1.1上一篇:1.0

我知道这有效:

str = "path: %(path)s curr: %(curr)s prev: %(prev)s" % {"path": dict["path"],"curr": curr, "prev": prev}
Run Code Online (Sandbox Code Playgroud)

但我希望有一个更短的方式,例如:

str = "path: %(path)s curr: %s prev: %s" % (dict, curr, prev)
Run Code Online (Sandbox Code Playgroud)

如果这看起来像是一个过于迂腐的问题,我道歉.

Tri*_*ych 50

你可以试试这个:

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

s = "path: %(path)s curr: %(curr)s prev: %(prev)s" % data
Run Code Online (Sandbox Code Playgroud)


mon*_*kut 23

当然,您可以使用较新的(来自2.6).format字符串方法:

>>> 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'   
Run Code Online (Sandbox Code Playgroud)

或者,如果所有元素都在字典中,您可以这样做:

>>> 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'
>>>
Run Code Online (Sandbox Code Playgroud)

str.format()文档:

这种字符串格式化方法是Python 3.0中的新标准,应该优先于新代码中字符串格式化操作中描述的%格式.

  • 使用str.format他可以写``path:{mydict [path]} curr:{curr} prev:{prev}".format(mydict = mydict,curr = curr,prev = prev)`甚至`locals() `for the format to format,`"path:{mydict [path]} curr:{curr} prev:{prev}".format(**locals())` (3认同)

Ale*_*lli 14

为什么不:

mystr = "path: %s curr: %s prev: %s" % (mydict[path], curr, prev)
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我已经更改了一些你在使用内置名称的踩踏的名字 - 不要这样做,它永远不需要,偶尔会浪费你很多时间来追踪它造成的不当行为(使用的东西)内置名称,假设它意味着内置,但你用我们自己的变量的名称隐藏它).


hug*_*own 13

也许:

path = dict['path']
str = "path: %(path)s curr: %(curr)s prev: %(prev)s" % locals()
Run Code Online (Sandbox Code Playgroud)

我的意思是它有效:

>>> 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'
Run Code Online (Sandbox Code Playgroud)

我只是不知道你是否考虑更短.

  • 避免使用locals()&globals():( (2认同)
  • 使用`locals()`意味着你不清楚你实际上是哪些变量.如果你想要编写你的代码,pylint可能会报告一些变量没有被使用,即使你用`locals()`隐式引用它们.Pylint必须检查所有字符串格式语句以进行此类隐式使用.因此,它是一种快捷方式,在使用之前您应该了解它. (2认同)

gab*_*ous 7

您还可以(很快)在 Python 3.6 中使用f 字符串,这可能是格式化字符串的最短方法:

print(f'path: {path} curr: {curr} prev: {prev}')
Run Code Online (Sandbox Code Playgroud)

甚至把你所有的数据放在一个字典中:

d = {"path": path, "curr": curr, "prev": prev}
print(f'path: {d["path"]} curr: {d["curr"]} prev: {d["prev"]}')
Run Code Online (Sandbox Code Playgroud)


Bem*_*mis 5

如果将数据放入字典中,您可以执行以下操作:

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

"{0}: {path}, {1}: {curr}, {2}: {prev}".format(*data, **data)
Run Code Online (Sandbox Code Playgroud)