说我有一个像这样的字典:
dic = {'outer_key_1': {'inner_key_1': [1, 2, 3],
'inner_key_2': [4, 5, 6],
'inner_key_3': [7, 8, 9]},
'outer_key_2': {'inner_key_1': [11, 12, 13],
'inner_key_2': [14, 15, 16],
'inner_key_3': [17, 18, 19]}}
我的目标是提取每个内部字典的第一个元素,并以嵌套列表结尾:
[[1, 4, 7], [11, 14, 17]]
或者,是这样的字典:
{'outer_key_1': [1, 4, 7], 'outer_key_2': [11, 14, 17]}
我已经尝试过使用嵌套列表推导方法到达那里,但是我能拿出的最好的是结果值的非嵌套列表(或多或少[1, 4, 7, 11, 14, 17]
除外,除非这些值混合在一起,使用OrderedDict可以很容易地解决该问题)反而)。这是一个使用for循环的丑陋解决方案,但是我敢肯定,这里的人可以提出更好的建议。
# TODO: find a better way to do this
result = []
for inner_dict in dic.values():
result.append([l[0] for l in inner_dict.values()])
print(result)
打印(再次,值混合在一起,但这不是手头的问题):
[[14, 17, 11], [4, 7, 1]]
解决这个问题的最优雅的方法是什么?我是python的新手,因此欢迎提供有关如何解决该问题的任何提示。我也尝试过尝试zip
,我认为这是一种非常不错的方法,但是我仍然需要全神贯注于如何将其与列表推导结合使用,所以...有什么建议吗?
这取决于您所说的优雅,但是对我来说,如果您对函数式编程理解得很好,以下内容将非常优雅
[zip(*e)[0] for e in map(dict.values, dic.values())]
那它做什么
dic.values()
返回字典中的值列表map(dict.values, dic.values())
返回字典中的第二层嵌套值zip
并获取第一行,实际上这是深度嵌套dict中的第一列。如果您想进一步优化
map
为itertools.imap
dict.values
为dict.itervalues
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句