【问题标题】:add key, value to dict if value is truthy如果值是真实的,则将键,值添加到 dict
【发布时间】:2020-09-05 14:45:52
【问题描述】:

我想构建一个字典,但只有当项目的值为真时才添加项目

我做以下事情

my_dict = {
          "key1": convert_value("foo"), 
          "key2": convert_value(None), 
          "key3": convert_value(""),
          "key4": "bar",
          "key5": ""
          }

问题是,我根本不希望键在字典中,如果它的 convert_value() 是假的,例如 key2 和 key3,在使用 convert_value() 函数转换后它们都是空字符串。

生成的字典将如下所示

{
 "key1": "foo", 
 "key2": "", 
 "key3": "",
 "key4": "bar",
 "key5": ""
}

但是我希望得到的 dict 就是这个

{
 "key1": "foo",
 "key4": "bar",
 "key5": "",
}

没有在转换后返回空值的 keys2 和 3。有什么办法可以直接在施工期间进行吗?

我不能使用 dict 理解,因为并非所有值在添加之前都经过 convert_value 函数(这些键可以有空值),事后删除它们似乎很浪费

编辑: 我真正要寻找的类似于提供如下默认值

      "key2": convert_value("foo") or "default",

但不是使用默认值,而是完全删除/跳过此键。那将是完美的。

【问题讨论】:

  • 能否使用 dic 理解,并使用中间函数在需要时调用 convert_value() 或在不需要 convert_value 时返回相同的值?
  • 您能否提供convert_value 函数的示例版本?一些上下文也可能有帮助 - 比如你为什么使用空字符串而不是说,一个哨兵object
  • @SergioFerrerSánchez 不,说实话,这是一长串非常不同的项目。其中一些使用 convert_value 函数,其他使用来自另一个 dict 的 .pop,或者通过 strftime 进行转换。不幸的是,这一切都非常特殊。我正在专门寻找可以跳过没有价值的键的东西 - 根据具体情况。
  • @wjandrea 当然,一些上下文可能会有所帮助。我主要使用它来转换日期时间,然后将它们发送到 api。遗憾的是,API 接收者不会接受空字符串——如果存在键“日期”。但是,如果“日期”字段完全丢失,它将接受请求。发送带有“日期”字段但“空字符串”作为其值的字段将被拒绝。我从数据库查询加载我的数据 - 即使它是空的,它也将始终返回该字段。如果此步骤中的值为空,我必须跳过这些键。 date 只是一个例子,许多其他的工作类似。
  • @c89 哦,所以关键很重要?很高兴知道!我之前在想,你不能过滤你当前的结果,因为你只会查看值并且两个空字符串是相同的,但是如果键很重要,这给了你一种过滤它的方法!

标签: python-3.x dictionary


【解决方案1】:

你可以试试emulating container types:

class CustomDict(dict): 
    def __setitem__(self, key, item): 
        if item: 
            super().__setitem__(key, item)

a = CustomDict()
a['1'] = 1
a['2'] = 0
a # should show {'1': 1}

我找到了这个related question

【讨论】:

  • 这还不错,但是,它会将“if item:”规则应用于所有项目,而不仅仅是我选择的那些键。有没有办法检查 item 本身是否是一个函数?
  • 是的,但那将是另一个if。您还可以传递一个元组来代替 itemkey 参数,并以不同的方式处理这些元组。但是你看,你总是会增加越来越多的复杂性来为字典添加一个键。然而,这是非常可定制的,所以我认为你肯定可以根据需要调整它
  • 我看到了,但我真的希望有一个我不知道的“或通过”表达。 (类似于提供默认值,但完全删除键)。不幸的是,它似乎不存在。如果没有其他问题,我会接受这个答案
  • 我实现了这个,但无法将“items”作为一个函数来获取 - 在 setitem 函数可以获取它们之前,它们似乎总是被转换为字符串当它们仍然起作用时。基本上,它会删除所有虚假的项目,而不仅仅是那些首先通过转换器功能的项目——这并不理想,也不完全是我所希望的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多