如何将嵌套字典中每个键的所有值提取到列表中(Python)
更Python风格的嵌套字典值提取方法
你现有的代码可以实现需求,但确实有更简洁、贴合Python风格的写法,下面给出几种优化方案:
原代码
if __name__ == "__main__": master_dict = {"1": {"1": 11, "2":22, "3": 33}, "2": {"1": 15, "2":23, "3": 31}} ones = [] twenties = [] thirties = [] for k, v in master_dict.items(): ones.append(v["1"]) twenties.append(v["2"]) thirties.append(v["3"]) print("ones : ", ones) print("twenties : ", twenties) print("thirties : ", thirties)
原运行结果
ones : [11, 15] twenties : [22, 23] thirties : [33, 31]
方案1:列表推导式(最简洁直观)
用列表推导式直接生成目标列表,省去循环内的append操作,代码更紧凑:
if __name__ == "__main__": master_dict = {"1": {"1": 11, "2":22, "3": 33}, "2": {"1": 15, "2":23, "3": 31}} ones = [v["1"] for v in master_dict.values()] twenties = [v["2"] for v in master_dict.values()] thirties = [v["3"] for v in master_dict.values()] print("ones : ", ones) print("twenties : ", twenties) print("thirties : ", thirties)
这里直接遍历master_dict.values()(不需要外层字典的键,所以不用items()),一行代码生成一个列表,符合Python的简洁风格。
方案2:单次遍历生成所有列表
如果担心多次遍历字典(虽然开销极小),可以用一次循环同时填充三个列表,兼顾效率和简洁性:
if __name__ == "__main__": master_dict = {"1": {"1": 11, "2":22, "3": 33}, "2": {"1": 15, "2":23, "3": 31}} ones, twenties, thirties = [], [], [] for v in master_dict.values(): ones.append(v["1"]) twenties.append(v["2"]) thirties.append(v["3"]) print("ones : ", ones) print("twenties : ", twenties) print("thirties : ", thirties)
把三个列表的初始化放在一行,同时遍历values(),比原代码更紧凑。
方案3:用zip批量提取
如果嵌套字典的键顺序固定,可通过zip一次性提取所有对应位置的值,代码量最少:
if __name__ == "__main__": master_dict = {"1": {"1": 11, "2":22, "3": 33}, "2": {"1": 15, "2":23, "3": 31}} # 按固定顺序取出子字典的值,再用zip打包分组 ones, twenties, thirties = zip(*((v["1"], v["2"], v["3"]) for v in master_dict.values())) # zip返回元组,转成列表(如果需要的话) ones, twenties, thirties = list(ones), list(twenties), list(thirties) print("ones : ", ones) print("twenties : ", twenties) print("thirties : ", thirties)
注:Python 3.7+中字典的values()会保留插入顺序,如果你的版本低于3.7,必须显式指定键的顺序(如上代码),避免值的顺序混乱。
内容的提问来源于stack exchange,提问作者Windy71
相关产品推荐
相关产品推荐

