python - 在字典中查找键列表返回首先找到

标签 python

我正在尝试实现类似于 ansible with_first_found 的东西,

configuration = {
   "fedora-27"    : "edge-case options for fedora 27",
   "ubuntu-14.04" : "edge-case options for ubuntu 14.04",
   "fedora"       : "as long as it's fedora, these options are fine",
   "ubuntu"       : "these options are good for all ubuntu versions",
   "redhat"       : "options for rpm distros",
   "debian"       : "try these options for anything remotely resembling debian",
   "default"      : "/if/all/else/fails",
}

if __name__ == "__main__":

   distribution_release = "ubuntu-16.04"
   distribution = "ubuntu"
   os_family = "debian"

   lookup = [
      distribution_release,
      distribution,
      os_family,
      "default"
   ]

   for key in lookup:
      if key in configuration:
         first_found = configuration[key]
         break

   print(first_found)

现在这段代码可以满足我的要求,但我觉得有更好的方法来执行此查找。这个 for/if/break 循环可以在一行中完成吗?

根据 timgeb 的评论,更接近我的目标。

   first_found = next(configuration[key] for key in lookup if key in configuration)

可能有点难读。

最佳答案

您的代码没有任何问题。

您可以通过构造一个生成器并对其调用 next 来缩短它。

>>> demo = {1:2, 3:4, 5:6}
>>> next(demo[k] for k in (6,3,5) if k in demo)
4

这也允许一个默认值:

>>> next((demo[k] for k in (0,-1,-2) if k in demo), 'default')
'default'

关于python - 在字典中查找键列表返回首先找到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48094725/

相关文章:

python - 如何转换 os.path.getctime()?

python - 从函数返回多个值的非侵入式方法?

python - sympy 矩阵未对齐

python - 用索引处的先前值填充 0

python - aws codebuild 是否仍然支持 python2.7 运行时?

python - 使用 kwargs 时如何转义 Python format() 中的冒号?

python - 在 python 中按值删除字典项的最佳方法是什么?

python - 使用 boolean 值列表进行埃拉托色尼筛选

python - 我正在创建这个基于人工智能的战术脚趾应用程序

python - 将一个大词典分成列表中的多个小词典