原谅这个复杂的标题,但我找不到更优雅的方式来表达这个问题。我能找到的壁橱问题可以在这里找到,但它并不能完全让我到达那里。
假设有许多不同长度的字典:
dict_1 = {'A':4, 'C':5}
dict_2 = {'A':1, 'B':2, 'C':3}
dict_3 = {'B':6}
这些词典的共同点是它们都共享此列表中的键:
my_keys= ['A','B','C']
但有些缺少一个或多个密钥。
目的是创建一个列表列表,其中每个列表元素是每个字典中所有现有值的列表,或者"None"(如果不存在特定键(。它们的键本身在所有字典中都是相同的,可以忽略不计。
因此,在这种情况下,预期的输出是:
final_list =
[[4,"None",5],
[1,2,3],
["None",6,"None"]]
我不确定如何处理它。您可以从my_keys
中的每个元素开始,并对照每个字典中的每个键检查它的存在;如果相关字典具有键,则该键的值将附加到临时列表中;否则,将附加"无"。一旦my_keys
全部迭代完毕,临时列表将附加到最终列表,循环将再次开始。
至少对我来说,说起来容易做起来难。我尝试了很多东西(我不会费心发布,因为它们甚至没有接近(。所以我想知道是否有一种优雅的方法来解决这个问题。
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)
一样好