【问题标题】:Can this conditional be shortened?这个条件可以缩短吗?
【发布时间】:2022-01-17 09:50:50
【问题描述】:

是否可以只使用字典中的.get() 函数?这是我们能做的最好的缩短这段代码的方法吗?

n_dictDict 类型(大写D)而NES 只是str 的列表

eted_info = {}
for key in n_dict:
    if key in NES:
        eted_info[key] = n_dict[key]

我只是好奇是否有更好/更 Pythonic 的方式来检索值,就像 C# 中的 TryGetValue

【问题讨论】:

  • n_dictNES 是什么?
  • 编辑显示类型
  • 大多数pythonic方式可能是使用dict理解。
  • eted_info 包含NES中的键? ...没有空值的键? NES 中有多少项?

标签: python


【解决方案1】:

我认为字典理解和使用n_dict.items() 是最干净的方法

n_dict = {'a': 1, 'b': 2, 'c': 3}

NES = ['a', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']

eted_info = {key:value for key,value in n_dict.items() if key in NES}

print(eted_info)

结果

{'a': 1, 'c': 3}

【讨论】:

    【解决方案2】:

    你可以用这样的字典理解来做一些事情:

    eted_info = {key: n_dict[key] for key in n_dict if key in NES}
    

    【讨论】:

    • 谢谢,那肯定看起来更好:) 有任何性能差异吗?
    • 它稍微快一点,但在大多数情况下不会快很多:stackoverflow.com/questions/52542742/…
    • 使用items()的轻微变化:eted_info = {k: v for k, v in n_dict.items() if k in NES}
    • 另一个使用集合(如果 NESndict 非常大,可能会更高效,因为它避免了 O(n^2) 查找):eted_info = {k: n_dict[k] for k in set(n_dict) & set(NES)}
    • @Samwise 你介意发布第二个作为答案吗?我不认为它对于可能的用途具有可读性,但正如你所说,对于非常大的 NESndict,它非常漂亮。
    【解决方案3】:

    如果您想避免为 n_dict 中的每个项目迭代 NES 中的每个项目的 O(n^2) 操作,您可以构建一个键列表作为 set 交集并遍历它:

    eted_info = {k: n_dict[k] for k in set(n_dict) & set(NES)}
    

    【讨论】:

      【解决方案4】:

      遍历NES中的keys;使用n_dict.get.get,默认为None;有条件地添加到eted_info

      for key in NES:
          v = n_dict.get(key,None)
          if v: eted_info[key] = v
      
      • 无论 n_dict 的长度如何,这只会遍历列表一次。
      • 假设n_dict 中的所有值都是真实的。其他占位符可用于默认值。

      【讨论】:

      • 你可以把它写成一个 dict-comprehension:: eted_info = {key:n_dict[key] for key in NES if key in n_dict} 几乎和@AndrewWei 一样,但细微的差别节省了有点复杂。
      • @AnneAunyme - 是的,你可以!随时将其添加(编辑)到我的答案中。
      猜你喜欢
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      • 2014-09-11
      • 1970-01-01
      • 2019-12-01
      相关资源
      最近更新 更多