遍历字典列表并从列表中找到匹配的元素并将匹配键的值附加到 defaultdict
Iterate over list of dictionaries and find matching elements from a list and append value of matching key to 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 也是。我该如何解决?
你可以这样做,不需要使用 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]}
你可以使用字典理解:
{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}
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
.
,这也适用于常规词典
我有一个字典列表。我们称它为: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 也是。我该如何解决?
你可以这样做,不需要使用 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]}
你可以使用字典理解:
{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}
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
.