字符串和字典的Python字符串插值在同一行

时间:2017-08-25 15:44:35

标签: python dictionary string-interpolation

我有一个字典和一个转换为字符串的日期时间对象。如何在同一行中打印日期时间字符串和字典中的几个项目?

例如:

dictionary = {"_source": {"host": "host", "type": "type"}}
datetime = '25-08-2017 10:26:11'

这就是我试图打印的内容:

print("%s %(host)s %(type)s" % (datetime,dictionary["_source"]))

在日期时间字符串上获取错误:

TypeError: format requires a mapping

谢谢!

5 个答案:

答案 0 :(得分:6)

一种方法是为日期时间arg指定一个名称:

"{t} {host} {type}".format(t=datetime,**dictionary["_source"])

但实际上即使没有它也能正常工作

"{} {host} {type}".format(datetime,**dictionary["_source"])

虽然最好在格式化字符串imo

中使用命名值

答案 1 :(得分:3)

最好使用format方法:

>>> "{} {d[host]} {d[type]}".format(datetime, d=dictionary["_source"])
'25-08-2017 10:26:11 host type'

答案 2 :(得分:2)

像其他人一样,使用str.format()可能是最好的。方法str.format()与您的问题最接近的选项是代码 Violet Red建议answer

"{} {host} {type}".format(datetime,**dictionary["_source"])

但如果您真的想要或需要使用旧的格式化方式(使用%),那么您可以尝试其中一些选项:

  • 将字符串分成两个或多个字符串

    与他Eugene Yarmash中解释的answer一样,您不能将普通和映射格式说明符混合在同一个字符串中,但您可以将它分成两个(或更多)字符串,如下所示:

    '%s' % datetime + ' %(type)s %(host)s' % dictionary["_source"]
    

    这样可行,但是如果你想在中间打印datetime(类似于这个'%(type)s %s %(host)s'),或者你有更多的普通和映射格式说明符交织在一起(类似这样{{1 }})。您可以将'%s '%(type)s %s %(host)s' %s分成多个字符串,如下所示:

    '%(type)s %s %(host)s'

    但是首先在字符串格式中没有任何意义。

  • 首先应用映射而不是普通格式说明符

    此方法解决了使用普通和映射格式说明符格式化字符串的问题。我将在OP的例子中解释这个方法。我们要格式化字符串'%(type)s' % dictionary["_source"] + ' %s ' % datetime + '%(host)s' % dictionary["_source"] 。就像我先说的那样,我们应用了映射格式说明符:

    '%s %(type)s %(host)s'

    如果我们这样做,它将打印出来:

    print('%s %(type)s %(host)s' % dictionary["_source"])
    

    这不起作用,但我们可以做的是在每个普通格式说明符中添加括号'{'type': 'type', 'host': 'host'} type host' 并使用()更新我们的字典:

    {'': '%s'}

    这将打印出来:

    print('%()s %(type)s %(host)s' % {'type': 'type', 'host': 'host', '': '%s'})

    我们可以使用'%s type host'轻松设置格式。

    问题是如何% (datetime)到你的字典。您有两个选项,可以使用函数或为字典对象定义类。

    <强> 1。使用功能

    {'': '%s'}

    你这样使用它:

    def ForFormat(x):
        d = x.copy()
        d.update({'': '%s'})
        return d
    

    结果正是我们想要的:

    print('%()s %(type)s %(host)s' % ForFormat(dictionary["_source"]) % (datetime))
    

    <强> 2。创建课程

    '25-08-2017 10:26:11 type 45 host'
    

    此处我们实际上并未将class FormatDict(dict): def __missing__(self, key): return '%s' 添加到字典中,而是更改其在字典中找不到密钥时调用的方法{'': '%s'},以便它将重新调整__missing__()对于不在字典中的每个映射格式说明符。它的使用方式如下:

    '%s'

    它还打印出所需的结果:

    print('%()s %(type)s %(host)s' % FormatDict(dictionary["_source"]) % (datetime))
    

答案 3 :(得分:1)

您不能在单个格式字符串中混合使用普通格式和映射格式说明符。你应该使用

"%s %s %s" % (param1, param2, param3)

"%(key1)s %(key2)s %(key3)s" % {"key1": val1, "key2": val2, "key3": val3}

在Python 3.6+中,您可以使用更加方便和有效的f-strings进行插值,例如:

f'{val1} {val2} {val3}'

其中替换字段是表达式在运行时评估。

答案 4 :(得分:0)

你可以试试这个:

dictionary = {"_source": {"host": "host", "type": "type"}}
datetime = '25-08-2017 10:26:11'

print("host {} type {} datetime {}".format(dictionary["_source"]["host"], dictionary["_source"]["type"], datetime))