【问题标题】:Check dictionary keys for presence of list elements, create list of values if present, 'None' otherwise检查字典键是否存在列表元素,如果存在则创建值列表,否则创建“无”
【发布时间】:2019-10-01 21:08:12
【问题描述】:

原谅这个复杂的标题,但我找不到更优雅的方式来表达这个问题。我可以找到can be found here 的壁橱问题,但它并没有完全让我到达那里。

假设有许多不同长度的字典:

dict_1 = {'A':4, 'C':5}
dict_2 = {'A':1, 'B':2, 'C':3}
dict_3 = {'B':6}

这些字典的共同点是它们都共享此列表中的键:

my_keys= ['A','B','C']

但有些缺少一个或多个键。

目的是创建一个列表列表,其中每个列表元素是每个字典中所有现有值的列表,或“无”,其中不存在特定键。它们的键本身在所有字典中都是相同的,可以忽略。

所以在这种情况下,预期的输出是:

    final_list = 
    [[4,"None",5],
    [1,2,3],
    ["None",6,"None"]]

我不确定如何处理它。您可以从my_keys 中的每个元素开始,并根据每个字典中的每个键检查它的存在;如果相关的 dict 有键,则将该键的值附加到临时列表中;否则,将附加“无”。一旦my_keys 全部迭代完毕,临时列表将附加到最终列表并重新开始循环。

至少对我来说,说起来容易做起来难。我尝试了很多东西(我不会费心发布,因为它们甚至没有接近)。所以我想知道是否有一个优雅的方法来解决这个问题。

【问题讨论】:

  • 倒数第二段听起来是一个合理的算法。当您尝试编写一些 for 循环和字典查找来实现它时,究竟是什么问题?
  • @mkrieger1 - 我被自己的鞋带缠住了,运行嵌套的for 循环(而且可能没有足够的咖啡......),而我真正需要的是一个像下面这样的简单解决方案。

标签: python list dictionary


【解决方案1】:

dict.get 可以返回默认值(例如,None)。如果我们以你的例子为例:

dict_1 = {'A':4, 'C':5}
dict_2 = {'A':1, 'B':2, 'C':3}
dict_3 = {'B':6}
my_keys= ['A','B','C']

然后dict_1.get('B', None) 是确保我们获得默认None 值的方法。我们可以用同样的方式遍历所有的键:

def dict_to_list(d, keys):
    return [d.get(key, None) for key in keys]

例子:

>>> dict_to_list(dict_1, my_keys)
[4, None, 5]
>>> dict_to_list(dict_2, my_keys)
[1, 2, 3]
>>> dict_to_list(dict_3, my_keys)
[None, 6, None]

编辑:None 是默认参数,即使它没有明确指定,所以dict_1.get('B')dict_1.get('B', None) 一样有效

【讨论】:

  • 哇,说的又短又优雅!感谢那。我为自己没有弄清楚这一点而感到尴尬。但是,是的,这样就完成了工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 2014-07-23
  • 2011-05-12
相关资源
最近更新 更多