遍历字典列表并从列表中找到匹配的元素,并将匹配键的值附加到defaultdict

时间:2018-10-24 20:27:55

标签: python dictionary defaultdict

我有一个字典清单。我们称之为:list_of_dict。列表中的字典采用以下格式:

{'a' : 1,
'b' : 5,
'c' : 3,
'd' : 6}

{'a' : 3,
'f' : 2,
'g' : 1,
'h' : 3,
'i' : 5,
'j' : 3}

我还有一个名为list_to_match的列表,其中仅包含一些字母:['a', 'f', 'x']

我需要遍历list_of_dict并找到与列表中元素匹配的键,并将值附加到列表项的空defaultdict中。如果找不到,请将0附加到列表中。

defaultdict初始化为:

d = collections.defaultdict(list)

我希望最终的defaultdict看起来像这样:

{'a' : [1, 3],
'f' : [0, 2],
'x' : [0, 0]}

到目前为止,我有:

for ld in list_of_dict:
    for match in list_to_match:
        for k, v in ld.items():
            d[match].append(v)
    d[match].append(0)

现在所有这些工作都与最后一行分开,因为显然,该范围中不存在匹配项。 现在,我得到的defaultdict是:

{'a' : [1, 3],
'f' : [2]}

0缺失,x也缺失。我该如何解决?

3 个答案:

答案 0 :(得分:2)

您可以执行此操作,无需使用defaultdict:

list_of_dict = [{'a': 1, 'b': 5,
                 'c': 3,
                 'd': 6}, {'a': 3,
                           'f': 2,
                           'g': 1,
                           'h': 3,
                           'i': 5,
                           'j': 3}]

list_to_match = ['a', 'f', 'x']

d = {}
for match in list_to_match:
    for ld in list_of_dict:
        d.setdefault(match, []).append(ld.get(match, 0))

print(d)

输出

{'a': [1, 3], 'x': [0, 0], 'f': [0, 2]}

答案 1 :(得分:2)

您可以使用字典理解:

{i: [j[i] if i in j else 0 for j in list_of_dict] for i in list_to_match}

收益:

{'a': [1, 3], 'f': [0, 2], 'x': [0, 0]}

更简单:

{i: [j.get(i, 0) for j in list_of_dict] for i in list_to_match}

答案 2 :(得分:1)

IIUC,您可以这样做:

for m in list_to_match:
    d[m] = [ld.get(m, 0) for ld in list_of_dict]
print(d)
#defaultdict(list, {'a': [1, 3], 'f': [0, 2], 'x': [0, 0]})

如果您不想使用defaultdict,这也适用于常规词典。