我有两个字典K和L。K是列表字典,L是嵌套字典
K={
'k1':[1,3,2],
'k2':[3,4,5],
'k3':[9,10,11]
}
L = {
'l1':{'a':'1','b':'1','c':'2'},
'l2':{'a':'1','b':'3','c':'2'},
'l3':{'a':'1','b':'2','c':'2'},
'l4':{'a':'1','b':'4','c':'2'}
}
我需要什么:我想根据以下条件创建一个新的列表字典。
- 我需要检查L的b值是否存在于列表的K字典中
- 如果有,我需要归还一本密钥为K的新词典字典和L键字典
对于上面的例子,我需要返回类似于这个的东西
M = {'k1':[l1,l3,l2]
'k2':[l2,l4]
}
这是我尝试过的代码:
M= {}
for k, v in K.items():
temp = []
for i in v:
if L[i]['b'] in K[k]:
temp.append(i)
M[k] = temp
print(M)
这是您的解决方案:
new_dict, M = dict(), dict()
for key, val in L.items():
new_dict[val['b']] = key
for key, val in K.items():
for x in val:
if str(x) in new_dict:
tmp = new_dict[str(x)]
lst = M[key] if key in M else list()
lst.append(tmp)
M[key] = lst
print(M)
对于以下K、L:
K = {
'k1':[1,3,2],
'k2':[3,4,5],
'k3':[9,10,11]
}
L = {
'l1':{'a':'1','b':'1','c':'2'},
'l2':{'a':'1','b':'3','c':'2'},
'l3':{'a':'1','b':'2','c':'2'},
'l4':{'a':'1','b':'4','c':'2'}
}
输出M:
M = {
'k2': ['l2', 'l4'],
'k1': ['l1', 'l2', 'l3']
}
[考虑L的b值具有唯一值,如果没有,则必须将其作为列表存储在new_dict
字典中。]
您在L
此处L[I]
中查找错误的内容。我将通过从L
初始创建一个查找来实现这一点,这样就不必为K
中的每个键循环通过L。从那里,您可以浏览K
一次,从查找中查找项目。
使用defaultdict
还可以处理L
具有相同的b
值的情况
from collections import defaultdict
b_val_to_l = defaultdict(set)
for lkey, ldict in L.items():
# For each ldict, extract the 'b' value, convert to an int and add the
# l key to the set of l values for the corresponding b value
b_val_to_l[int(ldict['b'])].add(lkey)
print(b_val_to_l)
M = defaultdict(list)
for k, v in K.items():
for i in v:
# For each value in the k, get the set of corresponding l values
b_set = b_val_to_l.get(i, set())
# Add to the output dict
M[k].extend(list(b_set))
print(M)
只需执行以下操作:
Mtemp = { k: [l for l in L
if int(L[l]['b']) in K[k]
] for k in K }
# Mtemp can have None values, so let's remove them...
M = { k: l for k, l in Mtemp.items() if len(l) > 0 }
输出:
{'k1': ['l1', 'l2', 'l3'], 'k2': ['l2', 'l4']}