【问题标题】:Print empty string if variable is None [duplicate]如果变量为无,则打印空字符串 [重复]
【发布时间】:2019-12-05 05:29:15
【问题描述】:

我正在尝试制作一个模板化字符串,该字符串将打印给定字典的值。但是,密钥可能存在也可能不存在于字典中。如果它不存在,我希望它返回一个空字符串。

为了说明我的意思,假设我有一个字典:

test_dict = { 1: "a", 2: "b"}

还有一个模板字符串:

'{} {} {}'.format(test_dict.get(1), test_dict.get(2), test_dict.get(3))

我想要以下输出:

'a b '

但是我得到了:

'a b None'

【问题讨论】:

  • 您的模板字符串在第二项之后明确包含一个逗号和一个空格,因此您想要的输出是不可能的。
  • 修正了错误
  • 第二项后面还有一个空格,所以还是不可能得到想要的输出。
  • 好的,再次修复。不过,这不是我的问题的重点。最后一个打印空字符串而不是None的占位符。
  • 您可以向.get() 传递一个额外的参数,以在未找到密钥时指定返回值,而不是默认的None。使用test_dict.get(3, ''),它会返回一个空字符串。

标签: python


【解决方案1】:

回复your comment

既然你提到了额外的空间,如果 key 不存在,有没有办法完全删除占位符?

是的,这是可能的。只需制作一个值列表,过滤掉任何Nones,然后加入结果:

In [3]: values = map(test_dict.get, [1, 2, 3])

In [4]: ' '.join(v for v in values if v is not None)
Out[4]: 'a b'

或者如果顺序不重要,或者如果您使用的是 Python 3.7+ 并且想要保留插入顺序,则可以跳过一些步骤:

In [5]: ' '.join(test_dict.values())
Out[5]: 'a b'

【讨论】:

  • 感谢您的帮助,但不幸的是,就我而言,顺序很重要。
  • @doctopus 哦,选项 1 保留顺序。选项 2 可能不会。
【解决方案2】:

每个 OP 评论的更新

您可以使用string 库在此处提供帮助。使用您的test_dict 查看以下脚本:

#https://stackoverflow.com/a/51359690
from string import Formatter

class NoneAsEmptyFormatter(Formatter):
    def get_value(self, key, args, kwargs):
        v = super().get_value(key, args, kwargs)
        return ' ' if v is None else v

fmt = NoneAsEmptyFormatter()

test_dict = { 1: "a", 2: "b"}

test_str = fmt.format('{} {} {}', test_dict.get(1), test_dict.get(2), test_dict.get(3))

print(test_str)

我们构建了一个快速的NoneAsEmptyFormatter 类,并使用它来格式化来自字典的字符串。

【讨论】:

  • 是的,我知道它为什么会导致 None。我想知道如何更改我的模板字符串,所以如果密钥不存在,它会返回一个空字符串而不是None
  • 在我的原始帖子回答了问题的第一个版本之后,现在每个 OP 的 cmets 编辑帖子(对于不小心投反对票的人)
【解决方案3】:

一种方法是获取字典的长度,并在模板中放置相同数量的占位符:

In [27]: test_dict = { 1: "a", 2: "b"}                                                                                                                                                                      

In [28]: ' '.join(['{}'] * len(test_dict))                                                                                                                                                                  
Out[28]: '{} {}'

In [29]: ' '.join(['{}'] * len(test_dict)).format(*test_dict.values())                                                                                                                                      
Out[29]: 'a b'

请注意,这与' '.join(test_dict.values()) 基本相同,但以模板字符串为例。

【讨论】:

  • 为什么不直接做' '.join(test_dict.values())
  • @wjandrea 是的,这就是计划。显示模板字符串以便更好地理解。
【解决方案4】:

使用字典的get 函数。这允许您指定在未找到键时要返回的值

'{}, {}, {}'.format(test_dict.get(1,''), test_dict.get(2,''), test_dict.get(3, ''))

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
相关资源
最近更新 更多