首页 > 解决方案 > 使用 dict-comprehension 复制嵌套的 for 循环

问题描述

给定以下代码:

列表列表的最小示例:

c = [['dog', 'Sg', 'Good'], ['cat', 'Pl', 'Okay'], ['dog', 'Pl', 'Bad'],
     ['dog', 'Sg', 'Good'], ['cat', 'Pl', 'Okay'], ['dog', 'Pl', 'Okay'],
     ['dog', 'Sg', 'Good'], ['cat', 'Sg', 'Good'], ['dog', 'Pl', 'Bad'],
     ['dog', 'Sg', 'Good'], ['cat', 'Pl', 'Okay'], ['dog', 'Pl', 'Bad']]

创建sets单词c

outer_keys = set()
inner_keys = set()
for x in c:
    outer_keys.add(x[0])
    inner_keys |= set(x[1:])

创建dictfor loop

Lemma = dict()
for i in outer_keys:
    j_d = dict()
    for j in inner_keys:
        j_d[j] = 0
    j_d[i] = 0  # this is the line I can't replicate with a comprehension
    Lemma[i] = j_d

for loop结果:

{'dog': {'Okay': 0, 'Pl': 0, 'Good': 0, 'Bad': 0, 'Sg': 0, 'dog': 0},
 'cat': {'Okay': 0, 'Pl': 0, 'Good': 0, 'Bad': 0, 'Sg': 0, 'cat': 0}}

使用dict comprehension

Lemma = {j: {i: 0 for i in inner_keys} for j in outer_keys}

注意:dog应该是 inside valueof outerdog和 forcat

我的dict comprehension结果:

{'dog': {'Okay': 0, 'Pl': 0, 'Good': 0, 'Bad': 0, 'Sg': 0},
 'cat': {'Okay': 0, 'Pl': 0, 'Good': 0, 'Bad': 0, 'Sg': 0}}

问题:

标签: pythondictionary

解决方案


您可以dict.fromkeys与 一起使用inner_keys | {j}

>>> {j: dict.fromkeys(inner_keys | {j}, 0) for j in outer_keys}
{'cat': {'Bad': 0, 'Good': 0, 'Okay': 0, 'Pl': 0, 'Sg': 0, 'cat': 0},
 'dog': {'Bad': 0, 'Good': 0, 'Okay': 0, 'Pl': 0, 'Sg': 0, 'dog': 0}}

推荐阅读